From 8a1fb562a73c3312da096b37a15993a8da5119ef Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Tue, 6 Feb 2024 15:32:43 -0700 Subject: [PATCH 1/4] RegTest: add output files for linearization frequencies --- .../executeOpenfastLinearRegressionCase.py | 90 +++++++++++++++++-- 1 file changed, 83 insertions(+), 7 deletions(-) diff --git a/reg_tests/executeOpenfastLinearRegressionCase.py b/reg_tests/executeOpenfastLinearRegressionCase.py index 9a721acab4..bd740f8741 100644 --- a/reg_tests/executeOpenfastLinearRegressionCase.py +++ b/reg_tests/executeOpenfastLinearRegressionCase.py @@ -98,6 +98,10 @@ def isclose(a, b, rtol=1e-09, atol=0.0): rtol_d=1e-2 atol_d=1e-1 +# --- Filenames for frequency info +fileNameFreqRef="frequencies_ref.txt" +fileNameFreqNew="frequencies_new.txt" + CasePrefix=' Case: {}: '.format(caseName) def exitWithError(msg): @@ -120,6 +124,8 @@ def indent(msg, sindent='\t'): inputsDirectory = os.path.join(moduleDirectory, caseName) targetOutputDirectory = os.path.join(inputsDirectory) testBuildDirectory = os.path.join(buildDirectory, caseName) +fNameFreqRef = os.path.join(testBuildDirectory, fileNameFreqRef) +fNameFreqNew = os.path.join(testBuildDirectory, fileNameFreqNew) # verify all the required directories exist if not os.path.isdir(rtest): @@ -183,7 +189,7 @@ def indent(msg, sindent='\t'): ### test for regression (compare lin files only) -def compareLin(f): +def compareLin(f,file_freq_ref,file_freq_new): Errors = [] ElemErrors = [] @@ -261,12 +267,44 @@ def newError(msg): Err='Failed to compare A-matrix frequencies\n\tLinfile: {}.\n\tException: {}'.format(local_file2, indent(e.args[0])) newError(Err) else: - #if verbose: - print(errPrefix+'freq_ref:', np.around(freq_bas[:8] ,5), '[Hz]') - print(errPrefix+'freq_new:', np.around(freq_loc[:8] ,5),'[Hz]') - print(errPrefix+'damp_ref:', np.around(zeta_bas[:8]*100,5), '[%]') - print(errPrefix+'damp_new:', np.around(zeta_loc[:8]*100,5), '[%]') + print('\n'+errPrefix+':') + print(' Frequency (Hz) Damping (%)') + print(' ---------------------------- ----------------------------') + print(' Ref New Ref New') + + #write frequencies to file + try: + file_freq_ref.write('\n'+errPrefix+':\n') + file_freq_ref.write(' Freq (Hz) Damp (%)\n') + file_freq_new.write('\n'+errPrefix+':\n') + file_freq_new.write(' Freq (Hz) Damp (%)\n') + except Exception: + pass # ignore all writing errors + + + for j in range(min(10,max(len(freq_bas),len(freq_loc)))): + if j0: Errors += ElemErrorsLoc[:3] # Just a couple of them +freqFileClose(ff1,ff2) + + if len(Errors)>0: exitWithError('See errors below: \n'+'\n'.join(Errors)) From 6d7762bf668cd6299a6abfe6cfa1ee7a811e8fe5 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Tue, 6 Feb 2024 17:09:35 -0700 Subject: [PATCH 2/4] Lin testing: add optional lowpass filtering on linearization frequency comparisons. --- reg_tests/CTestList.cmake | 68 ++++++++++--------- .../executeOpenfastLinearRegressionCase.py | 13 ++++ 2 files changed, 50 insertions(+), 31 deletions(-) diff --git a/reg_tests/CTestList.cmake b/reg_tests/CTestList.cmake index bbe017d88f..e06a5c04a7 100644 --- a/reg_tests/CTestList.cmake +++ b/reg_tests/CTestList.cmake @@ -18,7 +18,7 @@ # Generic test functions #=============================================================================== -function(regression TEST_SCRIPT EXECUTABLE SOURCE_DIRECTORY BUILD_DIRECTORY STEADYSTATE_FLAG TESTNAME LABEL) +function(regression TEST_SCRIPT EXECUTABLE SOURCE_DIRECTORY BUILD_DIRECTORY STEADYSTATE_FLAG TESTNAME LABEL OTHER_FLAGS) file(TO_NATIVE_PATH "${EXECUTABLE}" EXECUTABLE) file(TO_NATIVE_PATH "${TEST_SCRIPT}" TEST_SCRIPT) @@ -57,6 +57,10 @@ function(regression TEST_SCRIPT EXECUTABLE SOURCE_DIRECTORY BUILD_DIRECTORY STEA set(STEADYSTATE_FLAG "") endif() + if(OTHER_FLAGS STREQUAL " ") + set(OTHER_FLAGS "") + endif() + add_test( ${TESTNAME} ${Python_EXECUTABLE} ${TEST_SCRIPT} @@ -70,6 +74,7 @@ function(regression TEST_SCRIPT EXECUTABLE SOURCE_DIRECTORY BUILD_DIRECTORY STEA ${RUN_VERBOSE_FLAG} # empty or "-v" ${NO_RUN_FLAG} # empty or "-n" ${STEADYSTATE_FLAG} # empty or "-steadystate" + ${OTHER_FLAGS} ) # limit each test to 90 minutes: 5400s set_tests_properties(${TESTNAME} PROPERTIES TIMEOUT 5400 WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}" LABELS "${LABEL}") @@ -85,7 +90,7 @@ function(of_regression TESTNAME LABEL) set(OPENFAST_EXECUTABLE "${CTEST_OPENFAST_EXECUTABLE}") set(SOURCE_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}/..") set(BUILD_DIRECTORY "${CTEST_BINARY_DIR}/glue-codes/openfast") - regression(${TEST_SCRIPT} ${OPENFAST_EXECUTABLE} ${SOURCE_DIRECTORY} ${BUILD_DIRECTORY} " " ${TESTNAME} "${LABEL}") + regression(${TEST_SCRIPT} ${OPENFAST_EXECUTABLE} ${SOURCE_DIRECTORY} ${BUILD_DIRECTORY} " " ${TESTNAME} "${LABEL}" " ") endfunction(of_regression) function(of_aeromap_regression TESTNAME LABEL) @@ -94,7 +99,7 @@ function(of_aeromap_regression TESTNAME LABEL) set(SOURCE_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}/..") set(BUILD_DIRECTORY "${CTEST_BINARY_DIR}/glue-codes/openfast") set(STEADYSTATE_FLAG "-steadystate") - regression(${TEST_SCRIPT} ${OPENFAST_EXECUTABLE} ${SOURCE_DIRECTORY} ${BUILD_DIRECTORY} ${STEADYSTATE_FLAG} ${TESTNAME} "${LABEL}") + regression(${TEST_SCRIPT} ${OPENFAST_EXECUTABLE} ${SOURCE_DIRECTORY} ${BUILD_DIRECTORY} ${STEADYSTATE_FLAG} ${TESTNAME} "${LABEL}" " ") endfunction(of_aeromap_regression) function(of_fastlib_regression TESTNAME LABEL) @@ -103,7 +108,7 @@ function(of_fastlib_regression TESTNAME LABEL) set(SOURCE_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}/..") set(BUILD_DIRECTORY "${CTEST_BINARY_DIR}/glue-codes/openfast") # extra flag in call to "regression" on next line sets the ${TESTDIR} - regression(${TEST_SCRIPT} ${OPENFAST_EXECUTABLE} ${SOURCE_DIRECTORY} ${BUILD_DIRECTORY} " " "${TESTNAME}_fastlib" "${LABEL}" ${TESTNAME}) + regression(${TEST_SCRIPT} ${OPENFAST_EXECUTABLE} ${SOURCE_DIRECTORY} ${BUILD_DIRECTORY} " " "${TESTNAME}_fastlib" "${LABEL}" ${TESTNAME} " ") endfunction(of_fastlib_regression) # openfast aeroacoustic @@ -112,7 +117,7 @@ function(of_regression_aeroacoustic TESTNAME LABEL) set(OPENFAST_EXECUTABLE "${CTEST_OPENFAST_EXECUTABLE}") set(SOURCE_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}/..") set(BUILD_DIRECTORY "${CTEST_BINARY_DIR}/glue-codes/openfast") - regression(${TEST_SCRIPT} ${OPENFAST_EXECUTABLE} ${SOURCE_DIRECTORY} ${BUILD_DIRECTORY} " " ${TESTNAME} "${LABEL}") + regression(${TEST_SCRIPT} ${OPENFAST_EXECUTABLE} ${SOURCE_DIRECTORY} ${BUILD_DIRECTORY} " " ${TESTNAME} "${LABEL}" " ") endfunction(of_regression_aeroacoustic) # FAST Farm @@ -121,16 +126,17 @@ function(ff_regression TESTNAME LABEL) set(FASTFARM_EXECUTABLE "${CTEST_FASTFARM_EXECUTABLE}") set(SOURCE_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}/..") set(BUILD_DIRECTORY "${CTEST_BINARY_DIR}/glue-codes/fast-farm") - regression(${TEST_SCRIPT} ${FASTFARM_EXECUTABLE} ${SOURCE_DIRECTORY} ${BUILD_DIRECTORY} " " ${TESTNAME} "${LABEL}") + regression(${TEST_SCRIPT} ${FASTFARM_EXECUTABLE} ${SOURCE_DIRECTORY} ${BUILD_DIRECTORY} " " ${TESTNAME} "${LABEL}" " ") endfunction(ff_regression) # openfast linearized -function(of_regression_linear TESTNAME LABEL) +function(of_regression_linear TESTNAME OTHER_FLAGS LABEL) set(TEST_SCRIPT "${CMAKE_CURRENT_LIST_DIR}/executeOpenfastLinearRegressionCase.py") set(OPENFAST_EXECUTABLE "${CTEST_OPENFAST_EXECUTABLE}") set(SOURCE_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}/..") set(BUILD_DIRECTORY "${CTEST_BINARY_DIR}/glue-codes/openfast") - regression(${TEST_SCRIPT} ${OPENFAST_EXECUTABLE} ${SOURCE_DIRECTORY} ${BUILD_DIRECTORY} " " ${TESTNAME} "${LABEL}") + set(OTHER_FLAGS "${OTHER_FLAGS}") + regression(${TEST_SCRIPT} ${OPENFAST_EXECUTABLE} ${SOURCE_DIRECTORY} ${BUILD_DIRECTORY} " " ${TESTNAME} "${LABEL}" "${OTHER_FLAGS}") endfunction(of_regression_linear) # openfast C++ interface @@ -139,7 +145,7 @@ function(of_cpp_interface_regression TESTNAME LABEL) set(OPENFAST_CPP_EXECUTABLE "${CTEST_OPENFASTCPP_EXECUTABLE}") set(SOURCE_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}/..") set(BUILD_DIRECTORY "${CTEST_BINARY_DIR}/glue-codes/openfast-cpp") - regression(${TEST_SCRIPT} ${OPENFAST_CPP_EXECUTABLE} ${SOURCE_DIRECTORY} ${BUILD_DIRECTORY} " " ${TESTNAME} "${LABEL}") + regression(${TEST_SCRIPT} ${OPENFAST_CPP_EXECUTABLE} ${SOURCE_DIRECTORY} ${BUILD_DIRECTORY} " " ${TESTNAME} "${LABEL}" " ") endfunction(of_cpp_interface_regression) # openfast Python-interface @@ -148,7 +154,7 @@ function(of_regression_py TESTNAME LABEL) set(EXECUTABLE "None") set(SOURCE_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}/..") set(BUILD_DIRECTORY "${CTEST_BINARY_DIR}/glue-codes/python") - regression(${TEST_SCRIPT} ${EXECUTABLE} ${SOURCE_DIRECTORY} ${BUILD_DIRECTORY} " " ${TESTNAME} "${LABEL}") + regression(${TEST_SCRIPT} ${EXECUTABLE} ${SOURCE_DIRECTORY} ${BUILD_DIRECTORY} " " ${TESTNAME} "${LABEL}" " ") endfunction(of_regression_py) # aerodyn @@ -157,7 +163,7 @@ function(ad_regression TESTNAME LABEL) set(AERODYN_EXECUTABLE "${CTEST_AERODYN_EXECUTABLE}") set(SOURCE_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}/..") set(BUILD_DIRECTORY "${CTEST_BINARY_DIR}/modules/aerodyn") - regression(${TEST_SCRIPT} ${AERODYN_EXECUTABLE} ${SOURCE_DIRECTORY} ${BUILD_DIRECTORY} " " ${TESTNAME} "${LABEL}") + regression(${TEST_SCRIPT} ${AERODYN_EXECUTABLE} ${SOURCE_DIRECTORY} ${BUILD_DIRECTORY} " " ${TESTNAME} "${LABEL}" " ") endfunction(ad_regression) # aerodyn-Py @@ -166,7 +172,7 @@ function(py_ad_regression TESTNAME LABEL) set(AERODYN_EXECUTABLE "${Python_EXECUTABLE}") set(SOURCE_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}/..") set(BUILD_DIRECTORY "${CTEST_BINARY_DIR}/modules/aerodyn") - regression(${TEST_SCRIPT} ${AERODYN_EXECUTABLE} ${SOURCE_DIRECTORY} ${BUILD_DIRECTORY} " " ${TESTNAME} "${LABEL}") + regression(${TEST_SCRIPT} ${AERODYN_EXECUTABLE} ${SOURCE_DIRECTORY} ${BUILD_DIRECTORY} " " ${TESTNAME} "${LABEL}" " ") endfunction(py_ad_regression) @@ -176,7 +182,7 @@ function(ua_regression TESTNAME LABEL) set(AERODYN_EXECUTABLE "${CTEST_UADRIVER_EXECUTABLE}") set(SOURCE_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}/..") set(BUILD_DIRECTORY "${CTEST_BINARY_DIR}/modules/unsteadyaero") - regression(${TEST_SCRIPT} ${AERODYN_EXECUTABLE} ${SOURCE_DIRECTORY} ${BUILD_DIRECTORY} " " ${TESTNAME} "${LABEL}") + regression(${TEST_SCRIPT} ${AERODYN_EXECUTABLE} ${SOURCE_DIRECTORY} ${BUILD_DIRECTORY} " " ${TESTNAME} "${LABEL}" " ") endfunction(ua_regression) @@ -186,7 +192,7 @@ function(bd_regression TESTNAME LABEL) set(BEAMDYN_EXECUTABLE "${CTEST_BEAMDYN_EXECUTABLE}") set(SOURCE_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}/..") set(BUILD_DIRECTORY "${CTEST_BINARY_DIR}/modules/beamdyn") - regression(${TEST_SCRIPT} ${BEAMDYN_EXECUTABLE} ${SOURCE_DIRECTORY} ${BUILD_DIRECTORY} " " ${TESTNAME} "${LABEL}") + regression(${TEST_SCRIPT} ${BEAMDYN_EXECUTABLE} ${SOURCE_DIRECTORY} ${BUILD_DIRECTORY} " " ${TESTNAME} "${LABEL}" " ") endfunction(bd_regression) # hydrodyn @@ -195,7 +201,7 @@ function(hd_regression TESTNAME LABEL) set(HYDRODYN_EXECUTABLE "${CTEST_HYDRODYN_EXECUTABLE}") set(SOURCE_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}/..") set(BUILD_DIRECTORY "${CTEST_BINARY_DIR}/modules/hydrodyn") - regression(${TEST_SCRIPT} ${HYDRODYN_EXECUTABLE} ${SOURCE_DIRECTORY} ${BUILD_DIRECTORY} " " ${TESTNAME} "${LABEL}") + regression(${TEST_SCRIPT} ${HYDRODYN_EXECUTABLE} ${SOURCE_DIRECTORY} ${BUILD_DIRECTORY} " " ${TESTNAME} "${LABEL}" " ") endfunction(hd_regression) # py_hydrodyn @@ -204,7 +210,7 @@ function(py_hd_regression TESTNAME LABEL) set(HYDRODYN_EXECUTABLE "${Python_EXECUTABLE}") set(SOURCE_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}/..") set(BUILD_DIRECTORY "${CTEST_BINARY_DIR}/modules/hydrodyn") - regression(${TEST_SCRIPT} ${HYDRODYN_EXECUTABLE} ${SOURCE_DIRECTORY} ${BUILD_DIRECTORY} " " ${TESTNAME} "${LABEL}") + regression(${TEST_SCRIPT} ${HYDRODYN_EXECUTABLE} ${SOURCE_DIRECTORY} ${BUILD_DIRECTORY} " " ${TESTNAME} "${LABEL}" " ") endfunction(py_hd_regression) # subdyn @@ -213,7 +219,7 @@ function(sd_regression TESTNAME LABEL) set(SUBDYN_EXECUTABLE "${CTEST_SUBDYN_EXECUTABLE}") set(SOURCE_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}/..") set(BUILD_DIRECTORY "${CTEST_BINARY_DIR}/modules/subdyn") - regression(${TEST_SCRIPT} ${SUBDYN_EXECUTABLE} ${SOURCE_DIRECTORY} ${BUILD_DIRECTORY} " " ${TESTNAME} "${LABEL}") + regression(${TEST_SCRIPT} ${SUBDYN_EXECUTABLE} ${SOURCE_DIRECTORY} ${BUILD_DIRECTORY} " " ${TESTNAME} "${LABEL}" " ") endfunction(sd_regression) # inflowwind @@ -222,7 +228,7 @@ function(ifw_regression TESTNAME LABEL) set(INFLOWWIND_EXECUTABLE "${CTEST_INFLOWWIND_EXECUTABLE}") set(SOURCE_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}/..") set(BUILD_DIRECTORY "${CTEST_BINARY_DIR}/modules/inflowwind") - regression(${TEST_SCRIPT} ${INFLOWWIND_EXECUTABLE} ${SOURCE_DIRECTORY} ${BUILD_DIRECTORY} " " ${TESTNAME} "${LABEL}") + regression(${TEST_SCRIPT} ${INFLOWWIND_EXECUTABLE} ${SOURCE_DIRECTORY} ${BUILD_DIRECTORY} " " ${TESTNAME} "${LABEL}" " ") endfunction(ifw_regression) # py_inflowwind @@ -231,7 +237,7 @@ function(py_ifw_regression TESTNAME LABEL) set(INFLOWWIND_EXECUTABLE "${Python_EXECUTABLE}") set(SOURCE_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}/..") set(BUILD_DIRECTORY "${CTEST_BINARY_DIR}/modules/inflowwind") - regression(${TEST_SCRIPT} ${INFLOWWIND_EXECUTABLE} ${SOURCE_DIRECTORY} ${BUILD_DIRECTORY} " " ${TESTNAME} "${LABEL}") + regression(${TEST_SCRIPT} ${INFLOWWIND_EXECUTABLE} ${SOURCE_DIRECTORY} ${BUILD_DIRECTORY} " " ${TESTNAME} "${LABEL}" " ") endfunction(py_ifw_regression) # seastate @@ -240,7 +246,7 @@ function(seast_regression TESTNAME LABEL) set(SEASTATE_EXECUTABLE "${CTEST_SEASTATE_EXECUTABLE}") set(SOURCE_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}/..") set(BUILD_DIRECTORY "${CTEST_BINARY_DIR}/modules/seastate") - regression(${TEST_SCRIPT} ${SEASTATE_EXECUTABLE} ${SOURCE_DIRECTORY} ${BUILD_DIRECTORY} " " ${TESTNAME} "${LABEL}") + regression(${TEST_SCRIPT} ${SEASTATE_EXECUTABLE} ${SOURCE_DIRECTORY} ${BUILD_DIRECTORY} " " ${TESTNAME} "${LABEL}" " ") endfunction(seast_regression) # moordyn @@ -249,7 +255,7 @@ function(md_regression TESTNAME LABEL) set(MOORDYN_EXECUTABLE "${CTEST_MOORDYN_EXECUTABLE}") set(SOURCE_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}/..") set(BUILD_DIRECTORY "${CTEST_BINARY_DIR}/modules/moordyn") - regression(${TEST_SCRIPT} ${MOORDYN_EXECUTABLE} ${SOURCE_DIRECTORY} ${BUILD_DIRECTORY} " " ${TESTNAME} "${LABEL}") + regression(${TEST_SCRIPT} ${MOORDYN_EXECUTABLE} ${SOURCE_DIRECTORY} ${BUILD_DIRECTORY} " " ${TESTNAME} "${LABEL}" " ") endfunction(md_regression) # py_moordyn c-bindings interface @@ -258,7 +264,7 @@ function(py_md_regression TESTNAME LABEL) set(MOORDYN_EXECUTABLE "${Python_EXECUTABLE}") set(SOURCE_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}/..") set(BUILD_DIRECTORY "${CTEST_BINARY_DIR}/modules/moordyn") - regression(${TEST_SCRIPT} ${MOORDYN_EXECUTABLE} ${SOURCE_DIRECTORY} ${BUILD_DIRECTORY} " " ${TESTNAME} "${LABEL}") + regression(${TEST_SCRIPT} ${MOORDYN_EXECUTABLE} ${SOURCE_DIRECTORY} ${BUILD_DIRECTORY} " " ${TESTNAME} "${LABEL}" " ") endfunction(py_md_regression) # # Python-based OpenFAST Library tests @@ -336,15 +342,15 @@ of_regression_py("EllipticalWing_OLAF_py" "openfast;fastlib;p of_regression_aeroacoustic("IEA_LB_RWT-AeroAcoustics" "openfast;aerodyn15;aeroacoustics") # Linearized OpenFAST regression tests -# of_regression_linear("Fake5MW_AeroLin_B1_UA4_DBEMT3" "openfast;linear;elastodyn") #Also: aerodyn -# of_regression_linear("Fake5MW_AeroLin_B3_UA6" "openfast;linear;elastodyn") #Also: aerodyn -of_regression_linear("WP_Stationary_Linear" "openfast;linear;elastodyn") -of_regression_linear("Ideal_Beam_Fixed_Free_Linear" "openfast;linear;beamdyn") -of_regression_linear("Ideal_Beam_Free_Free_Linear" "openfast;linear;beamdyn") -of_regression_linear("5MW_Land_BD_Linear" "openfast;linear;beamdyn;servodyn") -of_regression_linear("5MW_OC4Semi_Linear" "openfast;linear;hydrodyn;servodyn") -of_regression_linear("StC_test_OC4Semi_Linear_Nac" "openfast;linear;servodyn;stc") -of_regression_linear("StC_test_OC4Semi_Linear_Tow" "openfast;linear;servodyn;stc") +of_regression_linear("Fake5MW_AeroLin_B1_UA4_DBEMT3" "-lowpass=0.05" "openfast;linear;elastodyn;aerodyn") +of_regression_linear("Fake5MW_AeroLin_B3_UA6" "-lowpass=0.05" "openfast;linear;elastodyn;aerodyn") +of_regression_linear("WP_Stationary_Linear" "" "openfast;linear;elastodyn") +of_regression_linear("Ideal_Beam_Fixed_Free_Linear" "-lowpass=0.05" "openfast;linear;beamdyn") +of_regression_linear("Ideal_Beam_Free_Free_Linear" "-lowpass=0.05" "openfast;linear;beamdyn") +of_regression_linear("5MW_Land_BD_Linear" "" "openfast;linear;beamdyn;servodyn") +of_regression_linear("5MW_OC4Semi_Linear" "" "openfast;linear;hydrodyn;servodyn") +of_regression_linear("StC_test_OC4Semi_Linear_Nac" "" "openfast;linear;servodyn;stc") +of_regression_linear("StC_test_OC4Semi_Linear_Tow" "" "openfast;linear;servodyn;stc") # FAST Farm regression tests if(BUILD_FASTFARM) diff --git a/reg_tests/executeOpenfastLinearRegressionCase.py b/reg_tests/executeOpenfastLinearRegressionCase.py index bd740f8741..5ddc3401ed 100644 --- a/reg_tests/executeOpenfastLinearRegressionCase.py +++ b/reg_tests/executeOpenfastLinearRegressionCase.py @@ -67,6 +67,7 @@ def isclose(a, b, rtol=1e-09, atol=0.0): parser.add_argument("-p", "-plot", dest="plot", action='store_true', help="bool to include plots in failed cases") parser.add_argument("-n", "-no-exec", dest="noExec", action='store_true', help="bool to prevent execution of the test cases") parser.add_argument("-v", "-verbose", dest="verbose", action='store_true', help="bool to include verbose system output") +parser.add_argument("-lowpass", dest='lowpass', metavar="LowPass-Filter", type=float, nargs='?', default=0.0, help="low pass filter on linearization frequencies to compare") args = parser.parse_args() @@ -79,6 +80,7 @@ def isclose(a, b, rtol=1e-09, atol=0.0): plotError = args.plot noExec = args.noExec verbose = args.verbose +lowpass = args.lowpass # --- Tolerances for matrix comparison # Outputs of lin matrices have 3 decimal digits leading to minimum error of 0.001 @@ -212,6 +214,14 @@ def newError(msg): print(msg) Errors.append(msg) + def ApplyLowPass(freq,zeta): + freqL=np.array([]) + zetaL=np.array([]) + for i in range(len(freq)): + if freq[i]>lowpass: + freqL = np.append(freqL,freq[i]) + zetaL = np.append(zetaL,zeta[i]) + return freqL,zetaL @@ -250,6 +260,9 @@ def newError(msg): _, zeta_bas, _, freq_bas = eigA(Abas, nq=None, nq1=None, sort=True, fullEV=True) _, zeta_loc, _, freq_loc = eigA(Aloc, nq=None, nq1=None, sort=True, fullEV=True) + freq_bas, zeta_bas = ApplyLowPass( freq_bas, zeta_bas ) + freq_loc, zeta_loc = ApplyLowPass( freq_loc, zeta_loc ) + if len(freq_bas)==0: # We use complex eigenvalues instead of frequencies/damping # If this fails often, we should discard this test. From 5c0c8a6552d906fcafc94380f4b7055219f29a45 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Tue, 6 Feb 2024 17:45:29 -0700 Subject: [PATCH 3/4] Lin Testing: disable Fake* linearization tests There is a bug in the AD15 linearization that is getting corrected in PR #2014 --- reg_tests/CTestList.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reg_tests/CTestList.cmake b/reg_tests/CTestList.cmake index e06a5c04a7..2aa2d2ad4d 100644 --- a/reg_tests/CTestList.cmake +++ b/reg_tests/CTestList.cmake @@ -342,8 +342,8 @@ of_regression_py("EllipticalWing_OLAF_py" "openfast;fastlib;p of_regression_aeroacoustic("IEA_LB_RWT-AeroAcoustics" "openfast;aerodyn15;aeroacoustics") # Linearized OpenFAST regression tests -of_regression_linear("Fake5MW_AeroLin_B1_UA4_DBEMT3" "-lowpass=0.05" "openfast;linear;elastodyn;aerodyn") -of_regression_linear("Fake5MW_AeroLin_B3_UA6" "-lowpass=0.05" "openfast;linear;elastodyn;aerodyn") +#of_regression_linear("Fake5MW_AeroLin_B1_UA4_DBEMT3" "-lowpass=0.05" "openfast;linear;elastodyn;aerodyn") +#of_regression_linear("Fake5MW_AeroLin_B3_UA6" "-lowpass=0.05" "openfast;linear;elastodyn;aerodyn") of_regression_linear("WP_Stationary_Linear" "" "openfast;linear;elastodyn") of_regression_linear("Ideal_Beam_Fixed_Free_Linear" "-lowpass=0.05" "openfast;linear;beamdyn") of_regression_linear("Ideal_Beam_Free_Free_Linear" "-lowpass=0.05" "openfast;linear;beamdyn") From 6f9e9a3a3dd0ccf798748cb79d2d6e66fffb62f8 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Wed, 7 Feb 2024 09:28:03 -0700 Subject: [PATCH 4/4] Lin: fix name: lowpass --> highpass Started with name lowcut, then mistyped and never thought about it again. Definitely a blundering mistake from someone who has designed and built multiple low and high-pass electronic filters over the years (facepalm). --- reg_tests/CTestList.cmake | 10 +++++----- reg_tests/executeOpenfastLinearRegressionCase.py | 12 ++++++------ 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/reg_tests/CTestList.cmake b/reg_tests/CTestList.cmake index 2aa2d2ad4d..84117dc328 100644 --- a/reg_tests/CTestList.cmake +++ b/reg_tests/CTestList.cmake @@ -108,7 +108,7 @@ function(of_fastlib_regression TESTNAME LABEL) set(SOURCE_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}/..") set(BUILD_DIRECTORY "${CTEST_BINARY_DIR}/glue-codes/openfast") # extra flag in call to "regression" on next line sets the ${TESTDIR} - regression(${TEST_SCRIPT} ${OPENFAST_EXECUTABLE} ${SOURCE_DIRECTORY} ${BUILD_DIRECTORY} " " "${TESTNAME}_fastlib" "${LABEL}" ${TESTNAME} " ") + regression(${TEST_SCRIPT} ${OPENFAST_EXECUTABLE} ${SOURCE_DIRECTORY} ${BUILD_DIRECTORY} " " "${TESTNAME}_fastlib" "${LABEL}" " " ${TESTNAME}) endfunction(of_fastlib_regression) # openfast aeroacoustic @@ -342,11 +342,11 @@ of_regression_py("EllipticalWing_OLAF_py" "openfast;fastlib;p of_regression_aeroacoustic("IEA_LB_RWT-AeroAcoustics" "openfast;aerodyn15;aeroacoustics") # Linearized OpenFAST regression tests -#of_regression_linear("Fake5MW_AeroLin_B1_UA4_DBEMT3" "-lowpass=0.05" "openfast;linear;elastodyn;aerodyn") -#of_regression_linear("Fake5MW_AeroLin_B3_UA6" "-lowpass=0.05" "openfast;linear;elastodyn;aerodyn") +#of_regression_linear("Fake5MW_AeroLin_B1_UA4_DBEMT3" "-highpass=0.05" "openfast;linear;elastodyn;aerodyn") +#of_regression_linear("Fake5MW_AeroLin_B3_UA6" "-highpass=0.05" "openfast;linear;elastodyn;aerodyn") of_regression_linear("WP_Stationary_Linear" "" "openfast;linear;elastodyn") -of_regression_linear("Ideal_Beam_Fixed_Free_Linear" "-lowpass=0.05" "openfast;linear;beamdyn") -of_regression_linear("Ideal_Beam_Free_Free_Linear" "-lowpass=0.05" "openfast;linear;beamdyn") +of_regression_linear("Ideal_Beam_Fixed_Free_Linear" "-highpass=0.05" "openfast;linear;beamdyn") +of_regression_linear("Ideal_Beam_Free_Free_Linear" "-highpass=0.05" "openfast;linear;beamdyn") of_regression_linear("5MW_Land_BD_Linear" "" "openfast;linear;beamdyn;servodyn") of_regression_linear("5MW_OC4Semi_Linear" "" "openfast;linear;hydrodyn;servodyn") of_regression_linear("StC_test_OC4Semi_Linear_Nac" "" "openfast;linear;servodyn;stc") diff --git a/reg_tests/executeOpenfastLinearRegressionCase.py b/reg_tests/executeOpenfastLinearRegressionCase.py index 5ddc3401ed..501d91d3c7 100644 --- a/reg_tests/executeOpenfastLinearRegressionCase.py +++ b/reg_tests/executeOpenfastLinearRegressionCase.py @@ -67,7 +67,7 @@ def isclose(a, b, rtol=1e-09, atol=0.0): parser.add_argument("-p", "-plot", dest="plot", action='store_true', help="bool to include plots in failed cases") parser.add_argument("-n", "-no-exec", dest="noExec", action='store_true', help="bool to prevent execution of the test cases") parser.add_argument("-v", "-verbose", dest="verbose", action='store_true', help="bool to include verbose system output") -parser.add_argument("-lowpass", dest='lowpass', metavar="LowPass-Filter", type=float, nargs='?', default=0.0, help="low pass filter on linearization frequencies to compare") +parser.add_argument("-highpass", dest='highpass', metavar="LowPass-Filter", type=float, nargs='?', default=0.0, help="high pass filter on linearization frequencies to compare") args = parser.parse_args() @@ -80,7 +80,7 @@ def isclose(a, b, rtol=1e-09, atol=0.0): plotError = args.plot noExec = args.noExec verbose = args.verbose -lowpass = args.lowpass +highpass = args.highpass # --- Tolerances for matrix comparison # Outputs of lin matrices have 3 decimal digits leading to minimum error of 0.001 @@ -214,11 +214,11 @@ def newError(msg): print(msg) Errors.append(msg) - def ApplyLowPass(freq,zeta): + def ApplyHighPass(freq,zeta): freqL=np.array([]) zetaL=np.array([]) for i in range(len(freq)): - if freq[i]>lowpass: + if freq[i]>highpass: freqL = np.append(freqL,freq[i]) zetaL = np.append(zetaL,zeta[i]) return freqL,zetaL @@ -260,8 +260,8 @@ def ApplyLowPass(freq,zeta): _, zeta_bas, _, freq_bas = eigA(Abas, nq=None, nq1=None, sort=True, fullEV=True) _, zeta_loc, _, freq_loc = eigA(Aloc, nq=None, nq1=None, sort=True, fullEV=True) - freq_bas, zeta_bas = ApplyLowPass( freq_bas, zeta_bas ) - freq_loc, zeta_loc = ApplyLowPass( freq_loc, zeta_loc ) + freq_bas, zeta_bas = ApplyHighPass( freq_bas, zeta_bas ) + freq_loc, zeta_loc = ApplyHighPass( freq_loc, zeta_loc ) if len(freq_bas)==0: # We use complex eigenvalues instead of frequencies/damping