From 74535a4b47d338aed367b82281c06c737e987628 Mon Sep 17 00:00:00 2001 From: Bonnie Jonkman Date: Mon, 17 Mar 2025 12:06:16 -0600 Subject: [PATCH 01/10] Adjust subroutines for converting between DCM and small angles - adjusted subroutines for computing small angles from DCM and the inverse routines to compute DCMs from small angles. These equations are accurate for larger angles. - This may already be in the v5.0.0 code --- modules/nwtc-library/src/NWTC_Num.f90 | 269 +++++++++++--------------- 1 file changed, 115 insertions(+), 154 deletions(-) diff --git a/modules/nwtc-library/src/NWTC_Num.f90 b/modules/nwtc-library/src/NWTC_Num.f90 index f667be1b11..a0f26777b0 100644 --- a/modules/nwtc-library/src/NWTC_Num.f90 +++ b/modules/nwtc-library/src/NWTC_Num.f90 @@ -2688,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 @@ -2753,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 @@ -5807,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 ) @@ -5825,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. @@ -5864,41 +5891,28 @@ SUBROUTINE SmllRotTransD( 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_DbKi + SqrdSum ) - ComDenom = SqrdSum*SQRT1SqrdSum + Theta1Sq = Theta1*Theta1 + Theta2Sq = Theta2*Theta2 + Theta3Sq = Theta3*Theta3 - 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 @@ -5906,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). @@ -5957,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. @@ -5996,41 +5970,28 @@ SUBROUTINE SmllRotTransR( 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_ReKi + SqrdSum ) - ComDenom = SqrdSum*SQRT1SqrdSum - - 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 From 641b478f2d29e77a7b539d67763bad9f3dca0cef Mon Sep 17 00:00:00 2001 From: Derek Slaughter Date: Wed, 11 Mar 2026 18:39:13 +0000 Subject: [PATCH 02/10] Reenable 5MW_OC4Jckt_DLL_WTurb_WavesIrr_MGrowth regression test and update r-test pointer --- reg_tests/CTestList.cmake | 2 +- reg_tests/r-test | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/reg_tests/CTestList.cmake b/reg_tests/CTestList.cmake index 50fe8829b5..5cd10e4da6 100644 --- a/reg_tests/CTestList.cmake +++ b/reg_tests/CTestList.cmake @@ -356,7 +356,7 @@ of_regression("5MW_OC3Mnpl_DLL_WTurb_WavesIrr_IceDyn" "openfast;elastodyn;aerod 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") +of_regression("5MW_OC4Jckt_DLL_WTurb_WavesIrr_MGrowth" "openfast;elastodyn;aerodyn;servodyn;hydrodyn;subdyn;offshore") of_regression("5MW_ITIBarge_DLL_WTurb_WavesIrr" "openfast;elastodyn;aerodyn;servodyn;hydrodyn;map;offshore") 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") diff --git a/reg_tests/r-test b/reg_tests/r-test index 6ee4f579f8..3f4036d6d2 160000 --- a/reg_tests/r-test +++ b/reg_tests/r-test @@ -1 +1 @@ -Subproject commit 6ee4f579f8a2d05c98b5dc3f44dd833992dbf76e +Subproject commit 3f4036d6d2c9b476e5ab2c05dacdab825015e83a From 72fbf5375527fb7d096b9d153959dc62df459b0b Mon Sep 17 00:00:00 2001 From: Derek Slaughter Date: Wed, 11 Mar 2026 19:03:28 +0000 Subject: [PATCH 03/10] Display info message if user specifies substepping with tightly coupled modules --- modules/openfast-library/src/FAST_Solver.f90 | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/modules/openfast-library/src/FAST_Solver.f90 b/modules/openfast-library/src/FAST_Solver.f90 index 8f2805d8a6..3d07605969 100644 --- a/modules/openfast-library/src/FAST_Solver.f90 +++ b/modules/openfast-library/src/FAST_Solver.f90 @@ -184,7 +184,20 @@ subroutine FAST_SolverInit(p_FAST, p, m, GlueModData, GlueModMaps, Turbine, ErrS end do !---------------------------------------------------------------------------- - ! Set solve flags and combine relevant modules into TC module + ! 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 From f9873b0e01fced0963c2b229e878ae950050b16c Mon Sep 17 00:00:00 2001 From: Derek Slaughter Date: Wed, 11 Mar 2026 19:52:25 +0000 Subject: [PATCH 04/10] User serial OpenBLAS in Github CI --- .github/workflows/automated-dev-tests.yml | 24 +++++++++++------------ reg_tests/r-test | 2 +- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/.github/workflows/automated-dev-tests.yml b/.github/workflows/automated-dev-tests.yml index cfb615cca6..0c4145bdf4 100644 --- a/.github/workflows/automated-dev-tests.yml +++ b/.github/workflows/automated-dev-tests.yml @@ -41,7 +41,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 libopenblas-dev libopenblas-serial-dev libhdf5-dev libnetcdf-dev libopenmpi-dev libyaml-cpp-dev - name: Setup workspace run: cmake -E make_directory ${{github.workspace}}/build - name: Configure build @@ -83,7 +83,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 libopenblas-dev libopenblas-serial-dev libhdf5-dev libnetcdf-dev libopenmpi-dev libyaml-cpp-dev - name: Setup workspace run: cmake -E make_directory ${{github.workspace}}/build - name: Configure build @@ -149,7 +149,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 libopenblas-dev libopenblas-serial-dev - name: Setup workspace run: cmake -E make_directory ${{github.workspace}}/build - name: Configure build @@ -281,7 +281,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 libopenblas-dev libopenblas-serial-dev sudo apt-get install -y libhdf5-dev libnetcdf-dev libopenmpi-dev libyaml-cpp-dev - name: Configure Tests working-directory: ${{github.workspace}}/build @@ -344,7 +344,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 libopenblas-dev libopenblas-serial-dev sudo apt-get install -y libhdf5-dev libnetcdf-dev libopenmpi-dev libyaml-cpp-dev - name: Configure Tests working-directory: ${{github.workspace}}/build @@ -401,7 +401,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 libopenblas-dev libopenblas-serial-dev sudo apt-get install -y libhdf5-dev libnetcdf-dev libopenmpi-dev libyaml-cpp-dev - name: Configure Tests working-directory: ${{github.workspace}}/build @@ -457,7 +457,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 libopenblas-dev libopenblas-serial-dev sudo apt-get install -y libhdf5-dev libnetcdf-dev libopenmpi-dev libyaml-cpp-dev - name: Configure Tests working-directory: ${{github.workspace}}/build @@ -512,7 +512,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 libopenblas-dev libopenblas-serial-dev sudo apt-get install -y libhdf5-dev libnetcdf-dev libopenmpi-dev libyaml-cpp-dev - name: Configure Tests working-directory: ${{github.workspace}}/build @@ -567,7 +567,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 libopenblas-dev libopenblas-serial-dev sudo apt-get install -y libhdf5-dev libnetcdf-dev libopenmpi-dev libyaml-cpp-dev - name: Configure Tests working-directory: ${{github.workspace}}/build @@ -619,7 +619,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 libopenblas-dev libopenblas-serial-dev sudo apt-get install -y libhdf5-dev libnetcdf-dev libopenmpi-dev libyaml-cpp-dev - name: Configure Tests working-directory: ${{github.workspace}}/build @@ -672,7 +672,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 libopenblas-dev libopenblas-serial-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 @@ -726,7 +726,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 libopenblas-dev libopenblas-serial-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/reg_tests/r-test b/reg_tests/r-test index 3f4036d6d2..42282ddb86 160000 --- a/reg_tests/r-test +++ b/reg_tests/r-test @@ -1 +1 @@ -Subproject commit 3f4036d6d2c9b476e5ab2c05dacdab825015e83a +Subproject commit 42282ddb8610882e048c3bea5317e82a27592a83 From 7123af0dd63c580dbddfe3a4a6ebab30c44bfcdc Mon Sep 17 00:00:00 2001 From: Derek Slaughter Date: Wed, 11 Mar 2026 21:51:08 +0000 Subject: [PATCH 05/10] Debugging randomly failing test --- .github/workflows/automated-dev-tests.yml | 26 +++++++++++------------ reg_tests/r-test | 2 +- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/.github/workflows/automated-dev-tests.yml b/.github/workflows/automated-dev-tests.yml index 0c4145bdf4..226c4e5b7c 100644 --- a/.github/workflows/automated-dev-tests.yml +++ b/.github/workflows/automated-dev-tests.yml @@ -41,7 +41,7 @@ jobs: - name: Install dependencies run: | sudo apt-get update -y - sudo apt-get install -y libopenblas-dev libopenblas-serial-dev libhdf5-dev libnetcdf-dev libopenmpi-dev libyaml-cpp-dev + sudo apt-get install -y libopenblas-serial-dev libhdf5-dev libnetcdf-dev libopenmpi-dev libyaml-cpp-dev - name: Setup workspace run: cmake -E make_directory ${{github.workspace}}/build - name: Configure build @@ -83,7 +83,7 @@ jobs: - name: Install dependencies run: | sudo apt-get update -y - sudo apt-get install -y libopenblas-dev libopenblas-serial-dev libhdf5-dev libnetcdf-dev libopenmpi-dev libyaml-cpp-dev + sudo apt-get install -y libopenblas-serial-dev libhdf5-dev libnetcdf-dev libopenmpi-dev libyaml-cpp-dev - name: Setup workspace run: cmake -E make_directory ${{github.workspace}}/build - name: Configure build @@ -149,7 +149,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-serial-dev + sudo apt-get install -y libopenblas-serial-dev - name: Setup workspace run: cmake -E make_directory ${{github.workspace}}/build - name: Configure build @@ -220,7 +220,7 @@ jobs: - name: Install dependencies run: | sudo apt-get update -y - sudo apt-get install -y libopenblas-dev + sudo apt-get install -y libopenblas-serial-dev - name: Set up MATLAB uses: matlab-actions/setup-matlab@v2 with: @@ -281,7 +281,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-serial-dev + sudo apt-get install -y libopenblas-serial-dev sudo apt-get install -y libhdf5-dev libnetcdf-dev libopenmpi-dev libyaml-cpp-dev - name: Configure Tests working-directory: ${{github.workspace}}/build @@ -344,7 +344,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-serial-dev + sudo apt-get install -y libopenblas-serial-dev sudo apt-get install -y libhdf5-dev libnetcdf-dev libopenmpi-dev libyaml-cpp-dev - name: Configure Tests working-directory: ${{github.workspace}}/build @@ -401,7 +401,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-serial-dev + sudo apt-get install -y libopenblas-serial-dev sudo apt-get install -y libhdf5-dev libnetcdf-dev libopenmpi-dev libyaml-cpp-dev - name: Configure Tests working-directory: ${{github.workspace}}/build @@ -457,7 +457,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-serial-dev + sudo apt-get install -y libopenblas-serial-dev sudo apt-get install -y libhdf5-dev libnetcdf-dev libopenmpi-dev libyaml-cpp-dev - name: Configure Tests working-directory: ${{github.workspace}}/build @@ -512,7 +512,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-serial-dev + sudo apt-get install -y libopenblas-serial-dev sudo apt-get install -y libhdf5-dev libnetcdf-dev libopenmpi-dev libyaml-cpp-dev - name: Configure Tests working-directory: ${{github.workspace}}/build @@ -567,7 +567,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-serial-dev + sudo apt-get install -y libopenblas-serial-dev sudo apt-get install -y libhdf5-dev libnetcdf-dev libopenmpi-dev libyaml-cpp-dev - name: Configure Tests working-directory: ${{github.workspace}}/build @@ -619,7 +619,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-serial-dev + sudo apt-get install -y libopenblas-serial-dev sudo apt-get install -y libhdf5-dev libnetcdf-dev libopenmpi-dev libyaml-cpp-dev - name: Configure Tests working-directory: ${{github.workspace}}/build @@ -672,7 +672,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-serial-dev + sudo apt-get install -y libopenblas-serial-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 @@ -726,7 +726,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-serial-dev + sudo apt-get install -y libopenblas-serial-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/reg_tests/r-test b/reg_tests/r-test index 42282ddb86..da262c9aea 160000 --- a/reg_tests/r-test +++ b/reg_tests/r-test @@ -1 +1 @@ -Subproject commit 42282ddb8610882e048c3bea5317e82a27592a83 +Subproject commit da262c9aea2fabbaca7343c4ed336a6382389a51 From d65c9b58dc49bd8565c9e0d446abba8669a757a7 Mon Sep 17 00:00:00 2001 From: Derek Slaughter Date: Wed, 11 Mar 2026 22:20:46 +0000 Subject: [PATCH 06/10] Try ATLAS BLAS --- .github/workflows/automated-dev-tests.yml | 32 +++++++++++------------ 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/.github/workflows/automated-dev-tests.yml b/.github/workflows/automated-dev-tests.yml index 226c4e5b7c..4eb21048bd 100644 --- a/.github/workflows/automated-dev-tests.yml +++ b/.github/workflows/automated-dev-tests.yml @@ -41,7 +41,7 @@ jobs: - name: Install dependencies run: | sudo apt-get update -y - sudo apt-get install -y libopenblas-serial-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 @@ -53,7 +53,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 \ @@ -83,7 +83,7 @@ jobs: - name: Install dependencies run: | sudo apt-get update -y - sudo apt-get install -y libopenblas-serial-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 +96,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 \ @@ -149,7 +149,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-serial-dev + sudo apt-get install -y libatlas-base-dev - name: Setup workspace run: cmake -E make_directory ${{github.workspace}}/build - name: Configure build @@ -161,7 +161,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 \ -DGENERATE_TYPES:BOOL=ON \ -DVARIABLE_TRACKING:BOOL=OFF \ @@ -220,7 +220,7 @@ jobs: - name: Install dependencies run: | sudo apt-get update -y - sudo apt-get install -y libopenblas-serial-dev + sudo apt-get install -y libatlas-base-dev - name: Set up MATLAB uses: matlab-actions/setup-matlab@v2 with: @@ -281,7 +281,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-serial-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 @@ -344,7 +344,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-serial-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 @@ -401,7 +401,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-serial-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 @@ -457,7 +457,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-serial-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 @@ -512,7 +512,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-serial-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 @@ -567,7 +567,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-serial-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 @@ -619,7 +619,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-serial-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 @@ -672,7 +672,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-serial-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 @@ -726,7 +726,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-serial-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 From 7ad2316fc0057fa6f3a513d5e75180c59d622424 Mon Sep 17 00:00:00 2001 From: Derek Slaughter Date: Thu, 12 Mar 2026 02:55:12 +0000 Subject: [PATCH 07/10] Try openblas-openmp-dev --- .github/workflows/automated-dev-tests.yml | 33 ++++++++++++----------- reg_tests/r-test | 2 +- 2 files changed, 18 insertions(+), 17 deletions(-) diff --git a/.github/workflows/automated-dev-tests.yml b/.github/workflows/automated-dev-tests.yml index 4eb21048bd..849d0a7ddc 100644 --- a/.github/workflows/automated-dev-tests.yml +++ b/.github/workflows/automated-dev-tests.yml @@ -41,7 +41,7 @@ jobs: - name: Install dependencies run: | sudo apt-get update -y - sudo apt-get install -y libatlas-base-dev libhdf5-dev libnetcdf-dev libopenmpi-dev libyaml-cpp-dev + sudo apt-get install -y libopenblas-openmp-dev libhdf5-dev libnetcdf-dev libopenmpi-dev libyaml-cpp-dev - name: Setup workspace run: cmake -E make_directory ${{github.workspace}}/build - name: Configure build @@ -53,7 +53,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=ATLAS \ + -DBLA_VENDOR:STRING=OpenBLAS \ -DCMAKE_BUILD_TYPE:STRING=DEBUG \ -DVARIABLE_TRACKING:BOOL=OFF \ -DDOUBLE_PRECISION:BOOL=OFF \ @@ -83,7 +83,7 @@ jobs: - name: Install dependencies run: | sudo apt-get update -y - sudo apt-get install -y libatlas-base-dev libhdf5-dev libnetcdf-dev libopenmpi-dev libyaml-cpp-dev + sudo apt-get install -y libopenblas-openmp-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 +96,7 @@ jobs: -DCMAKE_C_COMPILER:STRING=${{env.C_COMPILER}} \ -DPython_ROOT_DIR:PATH=${{env.pythonLocation}} \ -DBUILD_SHARED_LIBS:BOOL=OFF \ - -DBLA_VENDOR:STRING=ATLAS \ + -DBLA_VENDOR:STRING=OpenBLAS \ -DCMAKE_BUILD_TYPE:STRING=RelWithDebInfo \ -DVARIABLE_TRACKING:BOOL=OFF \ -DBUILD_TESTING:BOOL=ON \ @@ -149,7 +149,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 libatlas-base-dev + sudo apt-get install -y libopenblas-openmp-dev - name: Setup workspace run: cmake -E make_directory ${{github.workspace}}/build - name: Configure build @@ -161,7 +161,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=ATLAS \ + -DBLA_VENDOR:STRING=OpenBLAS \ -DCMAKE_BUILD_TYPE:STRING=DEBUG \ -DGENERATE_TYPES:BOOL=ON \ -DVARIABLE_TRACKING:BOOL=OFF \ @@ -220,7 +220,7 @@ jobs: - name: Install dependencies run: | sudo apt-get update -y - sudo apt-get install -y libatlas-base-dev + sudo apt-get install -y libopenblas-openmp-dev - name: Set up MATLAB uses: matlab-actions/setup-matlab@v2 with: @@ -281,7 +281,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 libatlas-base-dev + sudo apt-get install -y libopenblas-openmp-dev sudo apt-get install -y libhdf5-dev libnetcdf-dev libopenmpi-dev libyaml-cpp-dev - name: Configure Tests working-directory: ${{github.workspace}}/build @@ -344,7 +344,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 libatlas-base-dev + sudo apt-get install -y libopenblas-openmp-dev sudo apt-get install -y libhdf5-dev libnetcdf-dev libopenmpi-dev libyaml-cpp-dev - name: Configure Tests working-directory: ${{github.workspace}}/build @@ -401,7 +401,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 libatlas-base-dev + sudo apt-get install -y libopenblas-openmp-dev sudo apt-get install -y libhdf5-dev libnetcdf-dev libopenmpi-dev libyaml-cpp-dev - name: Configure Tests working-directory: ${{github.workspace}}/build @@ -457,7 +457,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 libatlas-base-dev + sudo apt-get install -y libopenblas-openmp-dev sudo apt-get install -y libhdf5-dev libnetcdf-dev libopenmpi-dev libyaml-cpp-dev - name: Configure Tests working-directory: ${{github.workspace}}/build @@ -512,7 +512,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 libatlas-base-dev + sudo apt-get install -y libopenblas-openmp-dev sudo apt-get install -y libhdf5-dev libnetcdf-dev libopenmpi-dev libyaml-cpp-dev - name: Configure Tests working-directory: ${{github.workspace}}/build @@ -567,7 +567,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 libatlas-base-dev + sudo apt-get install -y libopenblas-openmp-dev sudo apt-get install -y libhdf5-dev libnetcdf-dev libopenmpi-dev libyaml-cpp-dev - name: Configure Tests working-directory: ${{github.workspace}}/build @@ -619,7 +619,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 libatlas-base-dev + sudo apt-get install -y libopenblas-openmp-dev sudo apt-get install -y libhdf5-dev libnetcdf-dev libopenmpi-dev libyaml-cpp-dev - name: Configure Tests working-directory: ${{github.workspace}}/build @@ -672,7 +672,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 libatlas-base-dev + sudo apt-get install -y libopenblas-openmp-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 @@ -704,6 +704,7 @@ jobs: runs-on: ubuntu-24.04 needs: build-all-release env: + CTEST_PARALLEL_LEVEL: 2 OMP_NUM_THREADS: 2 steps: - name: Restore workspace from artifact @@ -726,7 +727,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 libatlas-base-dev + sudo apt-get install -y libopenblas-openmp-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/reg_tests/r-test b/reg_tests/r-test index da262c9aea..e5b4ae4ee3 160000 --- a/reg_tests/r-test +++ b/reg_tests/r-test @@ -1 +1 @@ -Subproject commit da262c9aea2fabbaca7343c4ed336a6382389a51 +Subproject commit e5b4ae4ee3f269867fc24b7274e5592301f87b01 From 1e132da0c0330b71a8b52a68faf2a89974fd60dc Mon Sep 17 00:00:00 2001 From: Derek Slaughter Date: Thu, 12 Mar 2026 03:27:27 +0000 Subject: [PATCH 08/10] Try atlas again --- .github/workflows/automated-dev-tests.yml | 32 +++++++++++------------ 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/.github/workflows/automated-dev-tests.yml b/.github/workflows/automated-dev-tests.yml index 849d0a7ddc..cd2684ad2d 100644 --- a/.github/workflows/automated-dev-tests.yml +++ b/.github/workflows/automated-dev-tests.yml @@ -41,7 +41,7 @@ jobs: - name: Install dependencies run: | sudo apt-get update -y - sudo apt-get install -y 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 @@ -53,7 +53,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 \ @@ -83,7 +83,7 @@ jobs: - name: Install dependencies run: | sudo apt-get update -y - sudo apt-get install -y 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 +96,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 \ @@ -149,7 +149,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-openmp-dev + sudo apt-get install -y libatlas-base-dev - name: Setup workspace run: cmake -E make_directory ${{github.workspace}}/build - name: Configure build @@ -161,7 +161,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 \ -DGENERATE_TYPES:BOOL=ON \ -DVARIABLE_TRACKING:BOOL=OFF \ @@ -220,7 +220,7 @@ jobs: - name: Install dependencies run: | sudo apt-get update -y - sudo apt-get install -y libopenblas-openmp-dev + sudo apt-get install -y libatlas-base-dev - name: Set up MATLAB uses: matlab-actions/setup-matlab@v2 with: @@ -281,7 +281,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-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 @@ -344,7 +344,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-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 @@ -401,7 +401,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-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 @@ -457,7 +457,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-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 @@ -512,7 +512,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-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 @@ -567,7 +567,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-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 @@ -619,7 +619,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-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 @@ -672,7 +672,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-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 @@ -727,7 +727,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-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 From 88021714733a5775ccf5ea1e64692b847251fc4c Mon Sep 17 00:00:00 2001 From: Derek Slaughter Date: Thu, 12 Mar 2026 11:17:16 +0000 Subject: [PATCH 09/10] update r-test pointer --- reg_tests/r-test | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reg_tests/r-test b/reg_tests/r-test index e5b4ae4ee3..5a8e01081a 160000 --- a/reg_tests/r-test +++ b/reg_tests/r-test @@ -1 +1 @@ -Subproject commit e5b4ae4ee3f269867fc24b7274e5592301f87b01 +Subproject commit 5a8e01081ac83baef3598a2009307826c068913b From 3b57cd36a262eab70ac79651841e82201a316d7a Mon Sep 17 00:00:00 2001 From: Derek Slaughter Date: Thu, 12 Mar 2026 11:22:24 +0000 Subject: [PATCH 10/10] Add note about using ATLAS instead of OpenBLAS --- .github/workflows/automated-dev-tests.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/automated-dev-tests.yml b/.github/workflows/automated-dev-tests.yml index cd2684ad2d..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: