From 553b82d6cd29151937c00e49e6a2f4a0f0f755de Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Tue, 18 Aug 2026 12:06:42 -0600 Subject: [PATCH 01/66] Update r-test: set MirrorRotor to F in all regression test cases Points at r-test commit baef6e291, which sets MirrorRotor to F in the three multi-rotor cases that previously set "F T". The flag is currently a parsing-only stub (FAST_Subs.f90:3080-3083), so results are unchanged. Co-authored-by: GitHub Copilot Co-authored-by: Claude Opus 5 --- 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 174a8ef776..baef6e291f 160000 --- a/reg_tests/r-test +++ b/reg_tests/r-test @@ -1 +1 @@ -Subproject commit 174a8ef7764a845782932122ab6ec5992c0f72e9 +Subproject commit baef6e291f535ebda3a721113198c975fa9db204 From 50f0cb41cf0ae13967a39beb82d8cce24fe4134e Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Tue, 18 Aug 2026 21:20:12 -0600 Subject: [PATCH 02/66] Fix GNU Debug build of fftpack5.1.f (-pedantic overrides -fallow-argument-mismatch) Debug builds with gfortran fail to compile fftpack5.1.f with 64 hard errors: Error: Type mismatch in argument 'dsum' at (1); passed REAL(4) to REAL(8) Error: Type mismatch in argument 'c' at (1); passed REAL(4) to COMPLEX(4) These mismatches are intentional: FFTPACK 5.1 uses legacy Fortran 77 type punning and is deliberately compiled with -fno-default-real-8 while the rest of the build uses -fdefault-real-8, so its callers can pass explicit SiKi/R4Ki arrays. -fallow-argument-mismatch is already applied to downgrade them to warnings. However, Debug builds add -pedantic, which promotes the argument mismatches back to errors and overrides -fallow-argument-mismatch. Appending -Wno-pedantic to this file's compile flags restores the intended behaviour. The suppression is scoped to this single legacy source; Release builds are unaffected as they do not pass -pedantic. Verified on gfortran 12.2.0 with cmake -DDOUBLE_PRECISION=On -DCMAKE_BUILD_TYPE=Debug -DGENERATE_TYPES=On .. Isolation test on the exact compile line: -pedantic -> 64 errors -pedantic -std=legacy -> 64 errors -pedantic -Wno-argument-mismatch -> 64 errors -pedantic -Wno-pedantic -> 0 errors (object builds) Co-authored-by: GitHub Copilot Co-authored-by: Claude Opus 5 --- modules/nwtc-library/CMakeLists.txt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/nwtc-library/CMakeLists.txt b/modules/nwtc-library/CMakeLists.txt index 52e3a8b036..c40457fcad 100644 --- a/modules/nwtc-library/CMakeLists.txt +++ b/modules/nwtc-library/CMakeLists.txt @@ -126,9 +126,11 @@ get_filename_component(FCNAME ${CMAKE_Fortran_COMPILER} NAME) # FFTPACK 5.1 uses legacy Fortran 77 type punning (COMPLEX<->REAL) and must # NOT be promoted to double precision (its callers pass explicit SiKi/R4Ki arrays). +# -Wno-pedantic is required because -pedantic (added for Debug builds) promotes the +# argument mismatches back to errors, overriding -fallow-argument-mismatch. if (${CMAKE_Fortran_COMPILER_ID} STREQUAL "GNU") set_source_files_properties(src/NetLib/fftpack/fftpack5.1.f PROPERTIES COMPILE_FLAGS - "-fallow-argument-mismatch -fno-default-real-8 -fno-default-double-8") + "-fallow-argument-mismatch -Wno-pedantic -fno-default-real-8 -fno-default-double-8") endif() # Recursive use of routine in qk61/dqk61 will trigger errors in debug From c7f2283058fcd5ef51ecfec7ce8fbe3188273ff5 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Tue, 18 Aug 2026 22:03:14 -0600 Subject: [PATCH 03/66] Mirror the AeroDyn rotor when MirrorRotor is set Adds the first working slice of counter-clockwise rotor support. A new RotInitInputType flag MirrorRotor selects a RotParameterType RotDir of -1, which is applied only at the AeroDyn module boundary. BEMT, unsteady aero, DBEMT and AirfoilInfo are untouched and continue to solve the equivalent clockwise problem, so airfoil polars are used verbatim and no polar transformation is needed. Applied on the way in (SetInputsForBEMT): omega, psi_s, theta, toeAngle, Vy and omega_z. The cant angle is deliberately not flipped. Blade twist and swept-AC offset are negated during init, after the setCantAngle loop, because setCantAngle derives BlCrvAng from BlTwist and the cant must not follow the mirror. Applied on the way out: the y-component of forces and the x and z components of moments, following v' = Sv for true vectors and w' = -Sw for pseudovectors with S = diag(1,-1,1). Several write-outputs mixed the two frames and are corrected here. Rotor and blade power used the clockwise omega against a mirrored Mxh, which produced negative power. BNFl, BNFd, BNFn and BNFt combined mirrored forces with clockwise phi and theta. BNVIndy multiplied two clockwise quantities. BNCy, BNCt and BNCm now carry the mirror. RtTSR keeps the clockwise omega, which is the value that stays positive. The free-wake copy of the blade output block is left alone; OLAF remains guard-railed. The AeroDyn driver gains a per-turbine MirrorRotor(i) input and mirrors the prescribed hub kinematics, standing in for ElastoDyn. Verified against a paired clockwise/mirrored NREL 5MW driver case: every one of the 150 output channels is exactly equal, exactly sign-flipped, a mirrored angle, or below the numerical noise floor, with zero residual. BEMT internals including Alpha, Phi, Vrel, Cl, Cd and the induction factors are bit-identical between the two runs. MirrorRotor defaults to false and the clockwise path is unchanged; the AeroDyn driver regression cases reproduce their baselines bit-for-bit. Co-authored-by: GitHub Copilot Co-authored-by: Claude Opus 5 --- modules/aerodyn/src/AeroDyn.f90 | 42 +++++++++++++------ .../aerodyn/src/AeroDyn_Driver_Registry.txt | 1 + modules/aerodyn/src/AeroDyn_Driver_Subs.f90 | 13 ++++-- modules/aerodyn/src/AeroDyn_Driver_Types.f90 | 4 ++ modules/aerodyn/src/AeroDyn_IO.f90 | 29 +++++++------ modules/aerodyn/src/AeroDyn_Registry.txt | 2 + modules/aerodyn/src/AeroDyn_Types.f90 | 8 ++++ reg_tests/r-test | 2 +- 8 files changed, 72 insertions(+), 29 deletions(-) diff --git a/modules/aerodyn/src/AeroDyn.f90 b/modules/aerodyn/src/AeroDyn.f90 index e6d6da99c7..01673b2a9b 100644 --- a/modules/aerodyn/src/AeroDyn.f90 +++ b/modules/aerodyn/src/AeroDyn.f90 @@ -401,6 +401,17 @@ subroutine AD_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, InitOut k = k + 1 end do end do + + ! MirrorRotor: mirror the blade geometry about the rotor XZ plane. Twist is a rotation + ! about the span axis and sweep is the in-plane offset, so both flip; curvature (out of + ! plane) does not. This must follow setCantAngle, which derives BlCrvAng from BlTwist. + do iR = 1, nRotors + if (.not. InitInp%rotors(iR)%MirrorRotor) cycle + do I=1,NumBlades(iR) + InputFileData%rotors(iR)%BladeProps(I)%BlTwist = -InputFileData%rotors(iR)%BladeProps(I)%BlTwist + InputFileData%rotors(iR)%BladeProps(I)%BlSwpAC = -InputFileData%rotors(iR)%BladeProps(I)%BlSwpAC + end do + end do !............................................................................................ ! Define parameters @@ -420,6 +431,8 @@ subroutine AD_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, InitOut p%Wake_Mod = InputFileData%Wake_Mod do iR = 1, nRotors p%rotors(iR)%AeroProjMod = AeroProjMod(iR) + p%rotors(iR)%RotDir = 1.0_ReKi + if (InitInp%rotors(iR)%MirrorRotor) p%rotors(iR)%RotDir = -1.0_ReKi call WrScr(' AeroDyn: projMod: '//trim(num2lstr(p%rotors(iR)%AeroProjMod))) call SetParameters( InitInp, InputFileData, InputFileData%rotors(iR), p%rotors(iR), p, ErrStat2, ErrMsg2 ) if (Failed()) return; @@ -3453,7 +3466,8 @@ subroutine SetInputsForBEMT(p, p_AD, u, RotInflow, m, indx, errStat, errMsg) m%tilt = tilt ! "Angular velocity of rotor" rad/s - m%BEMT_u(indx)%omega = dot_product( u%HubMotion%RotationVel(:,1), x_hat_disk ) + ! MirrorRotor: BEMT is always presented a CW-equivalent problem; see mirror_rotor docs. + m%BEMT_u(indx)%omega = p%RotDir * dot_product( u%HubMotion%RotationVel(:,1), x_hat_disk ) ! "Angle between the vector normal to the rotor plane and the wind vector (e.g., the yaw angle in the case of no tilt)" rad denom = TwoNorm( m%V_diskAvg ) @@ -3486,7 +3500,7 @@ subroutine SetInputsForBEMT(p, p_AD, u, RotInflow, m, indx, errStat, errMsg) !.......................... if (p%AeroProjMod==APM_BEM_NoSweepPitchTwist .or. p%AeroProjMod==APM_LiftingLine) then - m%BEMT_u(indx)%psi_s = Azimuth + m%BEMT_u(indx)%psi_s = p%RotDir * Azimuth elseif (p%AeroProjMod==APM_BEM_Polar) then do k=1,p%NumBlades @@ -3496,7 +3510,7 @@ subroutine SetInputsForBEMT(p, p_AD, u, RotInflow, m, indx, errStat, errMsg) ! Extract azimuth angle for blade k ! NOTE: EB, this might need improvements (express wrt hub, also deal with case hubRad=0). This is likely not psi_skew. theta = -EulerExtract( transpose(orientationBladeAzimuth(:,:,1)) ) - m%BEMT_u(indx)%psi_s(k) = theta(1) + m%BEMT_u(indx)%psi_s(k) = p%RotDir * theta(1) end do !k=blades ! Find the most-downwind azimuth angle needed by the skewed wake correction model @@ -3597,7 +3611,7 @@ subroutine SetInputsForBEMT(p, p_AD, u, RotInflow, m, indx, errStat, errMsg) ! Local and instantaneous blade twist+pitch (aerodynamic + elastic), cant and toe (include elastic deformation) do k=1,p%NumBlades do j=1,p%NumBlNds - m%BEMT_u(indx)%theta(j,k) = thetaBladeNds(j,k) ! local pitch + twist (aerodyanmic + elastic) angle of the jth node in the kth blade + m%BEMT_u(indx)%theta(j,k) = p%RotDir * thetaBladeNds(j,k) ! local pitch + twist (aerodyanmic + elastic) angle of the jth node in the kth blade ! NOTE: curve computed by Calculate_MeshOrientation_* m%BEMT_u(indx)%toeAngle(j,k) = 0.0_ReKi @@ -3607,8 +3621,8 @@ subroutine SetInputsForBEMT(p, p_AD, u, RotInflow, m, indx, errStat, errMsg) elseif (p%AeroProjMod==APM_BEM_Polar) then do k=1,p%NumBlades do j=1,p%NumBlNds - m%BEMT_u(indx)%theta(j,k) = thetaBladeNds(j,k) - m%BEMT_u(indx)%toeAngle(j,k) = m%Toe(j,k) + m%BEMT_u(indx)%theta(j,k) = p%RotDir * thetaBladeNds(j,k) + m%BEMT_u(indx)%toeAngle(j,k) = p%RotDir * m%Toe(j,k) m%BEMT_u(indx)%cantAngle(j,k) = m%Cant(j,k) end do !j=nodes end do !k=blades @@ -3629,7 +3643,7 @@ subroutine SetInputsForBEMT(p, p_AD, u, RotInflow, m, indx, errStat, errMsg) endif ! Velocity in "p" or "w" system (depending) on AeroProjMod m%BEMT_u(indx)%Vx(j,k) = dot_product( tmp, m%orientationAnnulus(1,:,j,k) ) ! normal component (normal to the plane, not chord) of the inflow velocity of the jth node in the kth blade - m%BEMT_u(indx)%Vy(j,k) = dot_product( tmp, m%orientationAnnulus(2,:,j,k) ) !+ TwoNorm(m%DisturbedInflow(:,j,k))*(sin()*sin(tilt)*)! tangential component (tangential to the plane, not chord) of the inflow velocity of the jth node in the kth blade + m%BEMT_u(indx)%Vy(j,k) = p%RotDir * dot_product( tmp, m%orientationAnnulus(2,:,j,k) ) !+ TwoNorm(m%DisturbedInflow(:,j,k))*(sin()*sin(tilt)*)! tangential component (tangential to the plane, not chord) of the inflow velocity of the jth node in the kth blade m%BEMT_u(indx)%Vz(j,k) = dot_product( tmp, m%orientationAnnulus(3,:,j,k) ) ! radial component (tangential to the plane, not chord) of the inflow velocity of the jth node in the kth blade ! NOTE: We'll likely remove that: @@ -3646,7 +3660,7 @@ subroutine SetInputsForBEMT(p, p_AD, u, RotInflow, m, indx, errStat, errMsg) do j=1,p%NumBlNds ! inputs for CUA (and CDBEMT): ! TODO Here we should take the rotation in the airfoil coordinate system instead of the "l" or "w" system - m%BEMT_u(indx)%omega_z(j,k) = dot_product( u%BladeMotion(k)%RotationVel( :,j), m%orientationAnnulus(3,:,j,k) ) ! rotation of no-sweep-pitch coordinate system around z of the jth node in the kth blade + m%BEMT_u(indx)%omega_z(j,k) = p%RotDir * dot_product( u%BladeMotion(k)%RotationVel( :,j), m%orientationAnnulus(3,:,j,k) ) ! rotation of no-sweep-pitch coordinate system around z of the jth node in the kth blade end do !j=nodes end do !k=blades @@ -4119,26 +4133,28 @@ subroutine SetOutputsFromBEMT( p, u, m, y ) Cya = -Cl*sin(aoa) + Cd*cos(aoa) ! Dimensionalize the aero forces and moment + ! MirrorRotor: BEMT returns CW-frame coefficients; RotDir maps the y-component of + ! forces and the x/z-components of moments back into the mirrored rotor frame. q = 0.5 * p%airDens * m%BEMT_y%Vrel(j,k)**2 ! dynamic pressure of the jth node in the kth blade c = p%BEMT%chord(j,k) forceAirfoil(1) = Cxa * q * c - forceAirfoil(2) = Cya * q * c + forceAirfoil(2) = p%RotDir * Cya * q * c forceAirfoil(3) = 0.0_reki momentAirfoil(1) = 0.0_reki momentAirfoil(2) = 0.0_reki - momentAirfoil(3) = Cm * q * c**2 + momentAirfoil(3) = p%RotDir * Cm * q * c**2 m%M(j,k) = momentAirfoil(3) ! TODO EB ! NOTE! - NOTE! - NOTE! - NOTE! - NOTE! - NOTE! - NOTE! - NOTE! - NOTE! - NOTE! - NOTE! - NOTE! - NOTE! - NOTE! !EAM (fix this!) These output variables are possibly not what they should be ! relative to the original AeroDyn manual and intent !!!! force(1) = m%BEMT_y%cx(j,k) * q * p%BEMT%chord(j,k) ! X = normal force per unit length (normal to the plane, not chord) of the jth node in the kth blade - force(2) = -m%BEMT_y%cy(j,k) * q * p%BEMT%chord(j,k) ! Y = tangential force per unit length (tangential to the plane, not chord) of the jth node in the kth blade + force(2) = -p%RotDir * m%BEMT_y%cy(j,k) * q * p%BEMT%chord(j,k) ! Y = tangential force per unit length (tangential to the plane, not chord) of the jth node in the kth blade force(3) = m%BEMT_y%cz(j,k) * q * p%BEMT%chord(j,k) ! Z = axial force per unit length of the jth node in the kth blade - moment(1)= m%BEMT_y%Cmx(j,k) * q * p%BEMT%chord(j,k)**2 ! Mx = pitching moment (x-component) per unit length of the jth node in the kth blade + moment(1)= p%RotDir * m%BEMT_y%Cmx(j,k) * q * p%BEMT%chord(j,k)**2 ! Mx = pitching moment (x-component) per unit length of the jth node in the kth blade moment(2)= m%BEMT_y%Cmy(j,k) * q * p%BEMT%chord(j,k)**2 ! My = pitching moment (y-component) per unit length of the jth node in the kth blade - moment(3)= m%BEMT_y%Cmz(j,k) * q * p%BEMT%chord(j,k)**2 ! Mz = pitching moment (z-component) per unit length of the jth node in the kth blade + moment(3)= p%RotDir * m%BEMT_y%Cmz(j,k) * q * p%BEMT%chord(j,k)**2 ! Mz = pitching moment (z-component) per unit length of the jth node in the kth blade ! save these values for possible output later: m%X(j,k) = force(1) diff --git a/modules/aerodyn/src/AeroDyn_Driver_Registry.txt b/modules/aerodyn/src/AeroDyn_Driver_Registry.txt index 64ea7e4a2a..2e89412822 100644 --- a/modules/aerodyn/src/AeroDyn_Driver_Registry.txt +++ b/modules/aerodyn/src/AeroDyn_Driver_Registry.txt @@ -114,6 +114,7 @@ typedef ^ ^ NacData nac typedef ^ ^ TwrData twr - - - "" - typedef ^ ^ IntKi numBlades - - - "" - typedef ^ ^ logical basicHAWTFormat - - - "If true simply input HubRad/Pitch/Overhang/Cone, otherwise all turbine inputs" - +typedef ^ ^ logical MirrorRotor - .FALSE. - "Flag indicating the rotor rotation direction is mirrored (counter-clockwise viewed from upwind)" - typedef ^ ^ logical hasTower - - - "" - typedef ^ ^ IntKi projMod - - - "If true simply input HubRad/Pitch/Overhang/Cone, otherwise all turbine inputs" - typedef ^ ^ IntKi BEM_Mod - - - "Switch for different BEM implementations" - diff --git a/modules/aerodyn/src/AeroDyn_Driver_Subs.f90 b/modules/aerodyn/src/AeroDyn_Driver_Subs.f90 index a305d32879..3a4c9e0c8e 100644 --- a/modules/aerodyn/src/AeroDyn_Driver_Subs.f90 +++ b/modules/aerodyn/src/AeroDyn_Driver_Subs.f90 @@ -559,6 +559,7 @@ subroutine Init_ADI_ForDriver(iCase, ADI, dvr, FED, dt, needInitIW, errStat, err InitInp%AD%rotors(iWT)%AeroProjMod = wt%projMod endif call WrScr(' Driver: projMod: '//trim(num2lstr(InitInp%AD%rotors(iWT)%AeroProjMod))) + InitInp%AD%rotors(iWT)%MirrorRotor = wt%MirrorRotor InitInp%AD%rotors(iWT)%HubPosition = y_ED%HubPtMotion%Position(:,1) InitInp%AD%rotors(iWT)%HubOrientation = y_ED%HubPtMotion%RefOrientation(:,:,1) InitInp%AD%rotors(iWT)%NacellePosition = y_ED%NacelleMotion%Position(:,1) @@ -741,6 +742,7 @@ subroutine Set_Mesh_Motion(nt, dvr, ADI, FED, errStat, errMsg) real(ReKi) :: bldMotion(3) ! Pitch, Pitch speed, Pitch Acc real(ReKi) :: timeState(5) ! HWindSpeed, PLExp, RotSpeed, Pitch, yaw real(ReKi) :: rotSpeedPrev ! Used for backward compatibility + real(ReKi) :: rotDirDvr ! +1 normal, -1 when the rotor rotation is mirrored real(R8Ki) :: orientation(3,3) real(R8Ki) :: orientation_loc(3,3) real(DbKi) :: time, timePrev @@ -885,13 +887,17 @@ subroutine Set_Mesh_Motion(nt, dvr, ADI, FED, errStat, errMsg) print*,'Unknown hun motion type, should never happen' STOP endif - theta(1) = wt%hub%azimuth*D2R + dvr%dt * wt%hub%rotSpeed + ! MirrorRotor: the driver stands in for ElastoDyn, so it prescribes the mirrored hub + ! kinematics here; hub%azimuth and hub%rotSpeed stay in the rotor's own convention. + rotDirDvr = 1.0_ReKi + if (wt%MirrorRotor) rotDirDvr = -1.0_ReKi + theta(1) = rotDirDvr * (wt%hub%azimuth*D2R + dvr%dt * wt%hub%rotSpeed) theta(2) = 0.0_ReKi theta(3) = 0.0_ReKi orientation_loc = EulerConstruct( theta ) y_ED%HubPtMotion%Orientation(:,:,1) = matmul(orientation_loc, y_ED%HubPtMotion%Orientation(:,:,1)) - y_ED%HubPtMotion%RotationVel( :,1) = y_ED%HubPtMotion%RotationVel(:,1) + y_ED%HubPtMotion%Orientation(1,:,1) * wt%hub%rotSpeed - y_ED%HubPtMotion%RotationAcc( :,1) = y_ED%HubPtMotion%RotationAcc(:,1) + y_ED%HubPtMotion%Orientation(1,:,1) * wt%hub%rotAcc + y_ED%HubPtMotion%RotationVel( :,1) = y_ED%HubPtMotion%RotationVel(:,1) + y_ED%HubPtMotion%Orientation(1,:,1) * rotDirDvr * wt%hub%rotSpeed + y_ED%HubPtMotion%RotationAcc( :,1) = y_ED%HubPtMotion%RotationAcc(:,1) + y_ED%HubPtMotion%Orientation(1,:,1) * rotDirDvr * wt%hub%rotAcc ! --- Blade motion ! Hub 2 blade root @@ -1072,6 +1078,7 @@ subroutine Dvr_ReadInputFile(fileName, dvr, errStat, errMsg ) wt%projMod = -1 endif call ParseVar(FileInfo_In, CurLine, 'BasicHAWTFormat'//sWT , wt%basicHAWTFormat , errStat2, errMsg2, unEc); if(Failed()) return + call ParseVar(FileInfo_In, CurLine, 'MirrorRotor'//sWT , wt%MirrorRotor , errStat2, errMsg2, unEc); if(Failed()) return ! Basic init wt%hub%azimuth = myNan diff --git a/modules/aerodyn/src/AeroDyn_Driver_Types.f90 b/modules/aerodyn/src/AeroDyn_Driver_Types.f90 index fd0ed3e19a..defd9cc9f8 100644 --- a/modules/aerodyn/src/AeroDyn_Driver_Types.f90 +++ b/modules/aerodyn/src/AeroDyn_Driver_Types.f90 @@ -146,6 +146,7 @@ MODULE AeroDyn_Driver_Types TYPE(TwrData) :: twr !< [-] INTEGER(IntKi) :: numBlades = 0_IntKi !< [-] LOGICAL :: basicHAWTFormat = .false. !< If true simply input HubRad/Pitch/Overhang/Cone, otherwise all turbine inputs [-] + LOGICAL :: MirrorRotor = .FALSE. !< Flag indicating the rotor rotation direction is mirrored (counter-clockwise viewed from upwind) [-] LOGICAL :: hasTower = .false. !< [-] INTEGER(IntKi) :: projMod = 0_IntKi !< If true simply input HubRad/Pitch/Overhang/Cone, otherwise all turbine inputs [-] INTEGER(IntKi) :: BEM_Mod = 0_IntKi !< Switch for different BEM implementations [-] @@ -911,6 +912,7 @@ subroutine AD_Dvr_CopyWTData(SrcWTDataData, DstWTDataData, CtrlCode, ErrStat, Er if (ErrStat >= AbortErrLev) return DstWTDataData%numBlades = SrcWTDataData%numBlades DstWTDataData%basicHAWTFormat = SrcWTDataData%basicHAWTFormat + DstWTDataData%MirrorRotor = SrcWTDataData%MirrorRotor DstWTDataData%hasTower = SrcWTDataData%hasTower DstWTDataData%projMod = SrcWTDataData%projMod DstWTDataData%BEM_Mod = SrcWTDataData%BEM_Mod @@ -1046,6 +1048,7 @@ subroutine AD_Dvr_PackWTData(RF, Indata) call AD_Dvr_PackTwrData(RF, InData%twr) call RegPack(RF, InData%numBlades) call RegPack(RF, InData%basicHAWTFormat) + call RegPack(RF, InData%MirrorRotor) call RegPack(RF, InData%hasTower) call RegPack(RF, InData%projMod) call RegPack(RF, InData%BEM_Mod) @@ -1107,6 +1110,7 @@ subroutine AD_Dvr_UnPackWTData(RF, OutData) call AD_Dvr_UnpackTwrData(RF, OutData%twr) ! twr call RegUnpack(RF, OutData%numBlades); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%basicHAWTFormat); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%MirrorRotor); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%hasTower); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%projMod); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%BEM_Mod); if (RegCheckErr(RF, RoutineName)) return diff --git a/modules/aerodyn/src/AeroDyn_IO.f90 b/modules/aerodyn/src/AeroDyn_IO.f90 index 5f919bb211..d974f4fb10 100644 --- a/modules/aerodyn/src/AeroDyn_IO.f90 +++ b/modules/aerodyn/src/AeroDyn_IO.f90 @@ -330,7 +330,7 @@ subroutine Calc_WriteOutput_AD() if (k<=size(BAeroFxi)) then ! Power contribution of blade wrt hub tmp = matmul( u%HubMotion%Orientation(:,:,1), m%HubLoad%moment(:,1) ) - m%AllOuts( BAeroPwr(k) ) = omega * tmp(1) + m%AllOuts( BAeroPwr(k) ) = p%RotDir * omega * tmp(1) ! In global, wrt hub! m%AllOuts( BAeroFxi(k) ) = m%HubLoad%force(1,1) @@ -359,7 +359,7 @@ subroutine Calc_WriteOutput_AD() m%AllOuts( RtAeroMyh ) = tmp(2) m%AllOuts( RtAeroMzh ) = tmp(3) - m%AllOuts( RtAeroPwr ) = omega * m%AllOuts( RtAeroMxh ) + m%AllOuts( RtAeroPwr ) = p%RotDir * omega * m%AllOuts( RtAeroMxh ) @@ -420,6 +420,7 @@ subroutine Calc_WriteOutput_BEMT() REAL(ReKi) :: denom !, rmax REAL(ReKi) :: ct, st ! cosine, sine of theta REAL(ReKi) :: cp, sp ! cosine, sine of phi + REAL(ReKi) :: Xcw, Ycw ! blade node forces in the CW-equivalent (BEMT) frame ! Induced velocity in Global @@ -450,7 +451,7 @@ subroutine Calc_WriteOutput_BEMT() m%AllOuts( BNM( beta,k) ) = m%BEMT_y%Vrel(j,k) / p%SpdSound m%AllOuts( BNVIndx(beta,k) ) = - m%BEMT_u(indx)%Vx(j,k) * m%BEMT_y%axInduction( j,k) - m%AllOuts( BNVIndy(beta,k) ) = m%BEMT_u(indx)%Vy(j,k) * m%BEMT_y%tanInduction(j,k) + m%AllOuts( BNVIndy(beta,k) ) = p%RotDir * m%BEMT_u(indx)%Vy(j,k) * m%BEMT_y%tanInduction(j,k) m%AllOuts( BNAxInd(beta,k) ) = m%BEMT_y%axInduction(j,k) m%AllOuts( BNTnInd(beta,k) ) = m%BEMT_y%tanInduction(j,k) @@ -469,22 +470,26 @@ subroutine Calc_WriteOutput_BEMT() sp=sin(m%BEMT_y%phi(j,k)) m%AllOuts( BNCl( beta,k) ) = m%BEMT_y%Cx(j,k)*cp + m%BEMT_y%Cy(j,k)*sp m%AllOuts( BNCd( beta,k) ) = m%BEMT_y%Cx(j,k)*sp - m%BEMT_y%Cy(j,k)*cp - m%AllOuts( BNCm( beta,k) ) = m%BEMT_y%Cm(j,k) + m%AllOuts( BNCm( beta,k) ) = p%RotDir * m%BEMT_y%Cm(j,k) m%AllOuts( BNCx( beta,k) ) = m%BEMT_y%Cx(j,k) - m%AllOuts( BNCy( beta,k) ) = m%BEMT_y%Cy(j,k) + m%AllOuts( BNCy( beta,k) ) = p%RotDir * m%BEMT_y%Cy(j,k) ct=cos(m%BEMT_u(indx)%theta(j,k)) st=sin(m%BEMT_u(indx)%theta(j,k)) - m%AllOuts( BNCn( beta,k) ) = m%BEMT_y%Cx(j,k)*ct + m%BEMT_y%Cy(j,k)*st - m%AllOuts( BNCt( beta,k) ) =-m%BEMT_y%Cx(j,k)*st + m%BEMT_y%Cy(j,k)*ct - - m%AllOuts( BNFl( beta,k) ) = m%X(j,k)*cp - m%Y(j,k)*sp - m%AllOuts( BNFd( beta,k) ) = m%X(j,k)*sp + m%Y(j,k)*cp + m%AllOuts( BNCn( beta,k) ) = m%BEMT_y%Cx(j,k)*ct + m%BEMT_y%Cy(j,k)*st + m%AllOuts( BNCt( beta,k) ) = p%RotDir*(-m%BEMT_y%Cx(j,k)*st + m%BEMT_y%Cy(j,k)*ct) + + ! MirrorRotor: m%X/m%Y are in the mirrored frame while phi and theta are the + ! CW-equivalent BEMT values, so convert the forces back before combining them. + Xcw = m%X(j,k) + Ycw = p%RotDir * m%Y(j,k) + m%AllOuts( BNFl( beta,k) ) = Xcw*cp - Ycw*sp + m%AllOuts( BNFd( beta,k) ) = Xcw*sp + Ycw*cp m%AllOuts( BNMm( beta,k) ) = m%M(j,k) m%AllOuts( BNFx( beta,k) ) = m%X(j,k) m%AllOuts( BNFy( beta,k) ) = -m%Y(j,k) - m%AllOuts( BNFn( beta,k) ) = m%X(j,k)*ct - m%Y(j,k)*st - m%AllOuts( BNFt( beta,k) ) = -m%X(j,k)*st - m%Y(j,k)*ct + m%AllOuts( BNFn( beta,k) ) = Xcw*ct - Ycw*st + m%AllOuts( BNFt( beta,k) ) = p%RotDir*(-Xcw*st - Ycw*ct) m%AllOuts( BNGam( beta,k) ) = 0.5_ReKi * p%BEMT%chord(j,k) * m%BEMT_y%Vrel(j,k) * m%BEMT_y%Cl(j,k) ! "Gam" [m^2/s] diff --git a/modules/aerodyn/src/AeroDyn_Registry.txt b/modules/aerodyn/src/AeroDyn_Registry.txt index 1c1f30babf..252da946f9 100644 --- a/modules/aerodyn/src/AeroDyn_Registry.txt +++ b/modules/aerodyn/src/AeroDyn_Registry.txt @@ -106,6 +106,7 @@ typedef ^ RotInitInputType R8Ki NacellePosition {3} - - "X-Y-Z reference positio typedef ^ RotInitInputType R8Ki NacelleOrientation {3}{3} - - "DCM reference orientation of nacelle" - typedef ^ RotInitInputType IntKi AeroProjMod - 1 - "Flag to switch between different projection models" - typedef ^ RotInitInputType ReKi RotSpeed - - 0 "Rotor speed used when AeroDyn is computing aero maps" "rad/s" +typedef ^ RotInitInputType Logical MirrorRotor - .FALSE. - "Flag indicating the rotor rotation direction is mirrored (counter-clockwise viewed from upwind)" - typedef ^ InitInputType RotInitInputType rotors {:} - - "Init Input Types for rotors" - typedef ^ InitInputType CHARACTER(1024) InputFile - - - "Name of the input file" - @@ -367,6 +368,7 @@ typedef ^ RotParameterType ReKi WtrDpth - - - "Water depth" m typedef ^ RotParameterType ReKi MSL2SWL - - - "Offset between still-water level and mean sea level" m typedef ^ RotParameterType IntKi AeroProjMod - 1 - "Flag to switch between different projection models" - typedef ^ RotParameterType IntKi BEM_Mod - -1 - "Flag to switch between different BEM Model" - +typedef ^ RotParameterType ReKi RotDir - 1.0 - "Rotor rotation direction: +1 normal (CW viewed from upwind), -1 mirrored (CCW)" - # parameters for output typedef ^ RotParameterType IntKi NumOuts - - - "Number of parameters in the output list (number of outputs requested)" - typedef ^ RotParameterType CHARACTER(1024) RootName - - - "RootName for writing output files" - diff --git a/modules/aerodyn/src/AeroDyn_Types.f90 b/modules/aerodyn/src/AeroDyn_Types.f90 index 01447c6f27..97b498b8fd 100644 --- a/modules/aerodyn/src/AeroDyn_Types.f90 +++ b/modules/aerodyn/src/AeroDyn_Types.f90 @@ -118,6 +118,7 @@ MODULE AeroDyn_Types REAL(R8Ki) , DIMENSION(1:3,1:3) :: NacelleOrientation = 0.0_R8Ki !< DCM reference orientation of nacelle [-] INTEGER(IntKi) :: AeroProjMod = 1 !< Flag to switch between different projection models [-] REAL(ReKi) :: RotSpeed = 0.0_ReKi !< Rotor speed used when AeroDyn is computing aero maps [rad/s] + LOGICAL :: MirrorRotor = .FALSE. !< Flag indicating the rotor rotation direction is mirrored (counter-clockwise viewed from upwind) [-] END TYPE RotInitInputType ! ======================= ! ========= AD_InitInputType ======= @@ -407,6 +408,7 @@ MODULE AeroDyn_Types REAL(ReKi) :: MSL2SWL = 0.0_ReKi !< Offset between still-water level and mean sea level [m] INTEGER(IntKi) :: AeroProjMod = 1 !< Flag to switch between different projection models [-] INTEGER(IntKi) :: BEM_Mod = -1 !< Flag to switch between different BEM Model [-] + REAL(ReKi) :: RotDir = 1.0 !< Rotor rotation direction: +1 normal (CW viewed from upwind), -1 mirrored (CCW) [-] INTEGER(IntKi) :: NumOuts = 0_IntKi !< Number of parameters in the output list (number of outputs requested) [-] CHARACTER(1024) :: RootName !< RootName for writing output files [-] TYPE(OutParmType) , DIMENSION(:), ALLOCATABLE :: OutParam !< Names and units (and other characteristics) of all requested output parameters [-] @@ -944,6 +946,7 @@ subroutine AD_CopyRotInitInputType(SrcRotInitInputTypeData, DstRotInitInputTypeD DstRotInitInputTypeData%NacelleOrientation = SrcRotInitInputTypeData%NacelleOrientation DstRotInitInputTypeData%AeroProjMod = SrcRotInitInputTypeData%AeroProjMod DstRotInitInputTypeData%RotSpeed = SrcRotInitInputTypeData%RotSpeed + DstRotInitInputTypeData%MirrorRotor = SrcRotInitInputTypeData%MirrorRotor end subroutine subroutine AD_DestroyRotInitInputType(RotInitInputTypeData, ErrStat, ErrMsg) @@ -976,6 +979,7 @@ subroutine AD_PackRotInitInputType(RF, Indata) call RegPack(RF, InData%NacelleOrientation) call RegPack(RF, InData%AeroProjMod) call RegPack(RF, InData%RotSpeed) + call RegPack(RF, InData%MirrorRotor) if (RegCheckErr(RF, RoutineName)) return end subroutine @@ -997,6 +1001,7 @@ subroutine AD_UnPackRotInitInputType(RF, OutData) call RegUnpack(RF, OutData%NacelleOrientation); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%AeroProjMod); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%RotSpeed); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%MirrorRotor); if (RegCheckErr(RF, RoutineName)) return end subroutine subroutine AD_CopyInitInput(SrcInitInputData, DstInitInputData, CtrlCode, ErrStat, ErrMsg) @@ -3757,6 +3762,7 @@ subroutine AD_CopyRotParameterType(SrcRotParameterTypeData, DstRotParameterTypeD DstRotParameterTypeData%MSL2SWL = SrcRotParameterTypeData%MSL2SWL DstRotParameterTypeData%AeroProjMod = SrcRotParameterTypeData%AeroProjMod DstRotParameterTypeData%BEM_Mod = SrcRotParameterTypeData%BEM_Mod + DstRotParameterTypeData%RotDir = SrcRotParameterTypeData%RotDir DstRotParameterTypeData%NumOuts = SrcRotParameterTypeData%NumOuts DstRotParameterTypeData%RootName = SrcRotParameterTypeData%RootName if (allocated(SrcRotParameterTypeData%OutParam)) then @@ -4003,6 +4009,7 @@ subroutine AD_PackRotParameterType(RF, Indata) call RegPack(RF, InData%MSL2SWL) call RegPack(RF, InData%AeroProjMod) call RegPack(RF, InData%BEM_Mod) + call RegPack(RF, InData%RotDir) call RegPack(RF, InData%NumOuts) call RegPack(RF, InData%RootName) call RegPack(RF, allocated(InData%OutParam)) @@ -4107,6 +4114,7 @@ subroutine AD_UnPackRotParameterType(RF, OutData) 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%RotDir); 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) diff --git a/reg_tests/r-test b/reg_tests/r-test index baef6e291f..d1769de40a 160000 --- a/reg_tests/r-test +++ b/reg_tests/r-test @@ -1 +1 @@ -Subproject commit baef6e291f535ebda3a721113198c975fa9db204 +Subproject commit d1769de40a94e445bf62eddbe1fcdfc0b65f24d4 From bfa552746206761344e8673a89c765e3377ec5af Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Tue, 18 Aug 2026 22:18:23 -0600 Subject: [PATCH 04/66] Mirror blade pitch and the skewed-wake frames A condition sweep over the AeroDyn driver (pitch, wind speed, tip-speed ratio, propeller-brake, tilt, precone, shear, yaw, both BEM models, DBEMT and four unsteady-aero models) exposed four sign errors that the original axisymmetric zero-pitch check could not reach. Blade pitch was not mirrored by the driver. Blade twist is negated when the inputs are read, so with a non-zero pitch the two ended up in opposite frames and the local angle of attack was wrong. The driver stands in for ElastoDyn here, so it now applies RotDir to the prescribed pitch and its rate, matching p%BlPitch = p%RotDir * BlPitch. The skew-aligned disk frame used to measure the azimuth fed to the skewed wake correction is built from cross(V_diskAvg, x_hat_disk). That is a pseudovector, so under the mirror the frame changed handedness and the azimuth came out as pi minus azimuth rather than negated. The correction was then applied with the wrong sign, moving the axial induction the wrong way around the disk. RotDir is now applied to that vector, which leaves the azimuth already in the clockwise-equivalent frame, so psi_s no longer needs its own factor. This was invisible without Skew_Mod = 1 because psi_s is not used elsewhere. The polar BEM path builds psiSkewOffset from a second cross product and needed the same treatment; applying RotDir to z_vec makes that triad mirror as S R S, after which theta(1) simply negates. Finally the reported skew angle is placed in the rotor's own convention. Its sign is cosmetic, since chi is formed from abs(chi0), and this makes the two BEM models agree with each other under the mirror. All 23 sweep variants now pass: every channel is identical, exactly sign-flipped, or below the numerical noise floor. The clockwise path is unchanged and the AeroDyn driver regression cases stay bit-identical. Co-authored-by: GitHub Copilot Co-authored-by: Claude Opus 5 --- modules/aerodyn/src/AeroDyn.f90 | 19 ++++++++++++++----- modules/aerodyn/src/AeroDyn_Driver_Subs.f90 | 8 +++++--- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/modules/aerodyn/src/AeroDyn.f90 b/modules/aerodyn/src/AeroDyn.f90 index 01673b2a9b..8cf674ff46 100644 --- a/modules/aerodyn/src/AeroDyn.f90 +++ b/modules/aerodyn/src/AeroDyn.f90 @@ -3490,7 +3490,9 @@ subroutine SetInputsForBEMT(p, p_AD, u, RotInflow, m, indx, errStat, errMsg) endif if (p%BEM_Mod /= BEMMod_2D) then ! TODO - m%BEMT_u(indx)%chi0 = sign( m%BEMT_u(indx)%chi0, signOfAngle ) + ! MirrorRotor: SkewVec is a pseudovector, so RotDir keeps the reported skew + ! angle in the rotor's own convention, matching the BEMMod_2D path above. + m%BEMT_u(indx)%chi0 = sign( m%BEMT_u(indx)%chi0, p%RotDir * signOfAngle ) endif end if @@ -3500,7 +3502,9 @@ subroutine SetInputsForBEMT(p, p_AD, u, RotInflow, m, indx, errStat, errMsg) !.......................... if (p%AeroProjMod==APM_BEM_NoSweepPitchTwist .or. p%AeroProjMod==APM_LiftingLine) then - m%BEMT_u(indx)%psi_s = p%RotDir * Azimuth + ! Azimuth is measured in the skew-aligned disk frame, which DiskAvgValues already + ! keeps in the CW-equivalent orientation, so no further mirroring here. + m%BEMT_u(indx)%psi_s = Azimuth elseif (p%AeroProjMod==APM_BEM_Polar) then do k=1,p%NumBlades @@ -3520,7 +3524,9 @@ subroutine SetInputsForBEMT(p, p_AD, u, RotInflow, m, indx, errStat, errMsg) m%BEMT_u(indx)%psiSkewOffset = PiBy2 else ! Assemble blade azimuth unit vectors and orientation matrix - z_vec = windCrossDisk / windCrossDiskMag + ! MirrorRotor: windCrossDisk is a pseudovector; RotDir keeps this triad + ! right-handed so it mirrors as S*R*S and theta(1) simply negates. + z_vec = p%RotDir * windCrossDisk / windCrossDiskMag x_vec = x_hat_disk y_vec = cross_product( z_vec, x_vec ) orientation(1,:) = x_vec @@ -3528,7 +3534,7 @@ subroutine SetInputsForBEMT(p, p_AD, u, RotInflow, m, indx, errStat, errMsg) orientation(3,:) = z_vec ! Extract azimuth angle for most down-wind blade orientation theta = -EulerExtract( transpose(orientation) ) - m%BEMT_u(indx)%psiSkewOffset = theta(1)+PiBy2 ! cross-product of wind vector and rotor axis will lead downwind blade azimuth by 90 degrees + m%BEMT_u(indx)%psiSkewOffset = p%RotDir * theta(1)+PiBy2 ! cross-product of wind vector and rotor axis will lead downwind blade azimuth by 90 degrees end if @@ -3750,7 +3756,10 @@ subroutine DiskAvgValues(p, u, RotInflow, m, x_hat_disk, y_hat_disk, z_hat_disk, z_hat_disk = u%HubMotion%Orientation(3,:,1) else y_hat_disk = tmp / tmp_sz - z_hat_disk = cross_product( m%V_diskAvg, x_hat_disk ) / tmp_sz + ! MirrorRotor: this cross product is a pseudovector, so without RotDir the + ! skew-aligned frame would flip handedness and Azimuth would come out as + ! pi-Azimuth instead of the CW-equivalent value the skew model expects. + z_hat_disk = p%RotDir * cross_product( m%V_diskAvg, x_hat_disk ) / tmp_sz end if ! "Azimuth angle" rad diff --git a/modules/aerodyn/src/AeroDyn_Driver_Subs.f90 b/modules/aerodyn/src/AeroDyn_Driver_Subs.f90 index 3a4c9e0c8e..d5c0c08ae7 100644 --- a/modules/aerodyn/src/AeroDyn_Driver_Subs.f90 +++ b/modules/aerodyn/src/AeroDyn_Driver_Subs.f90 @@ -910,13 +910,15 @@ subroutine Set_Mesh_Motion(nt, dvr, ADI, FED, errStat, errMsg) elseif (wt%bld(iB)%motionType==idBldMotionVariable) then call interpTimeValue(wt%bld(iB)%motion, time, wt%bld(iB)%iMotion, bldMotion) wt%bld(iB)%pitch =bldMotion(1) - y_ED%BladeRootMotion(iB)%RotationVel(:,1) = y_ED%BladeRootMotion(iB)%RotationVel(:,1) + y_ED%BladeRootMotion(iB)%Orientation(3,:,1)* (-bldMotion(2)) - y_ED%BladeRootMotion(iB)%RotationAcc(:,1) = y_ED%BladeRootMotion(iB)%RotationAcc(:,1) + y_ED%BladeRootMotion(iB)%Orientation(3,:,1)* (-bldMotion(3)) + y_ED%BladeRootMotion(iB)%RotationVel(:,1) = y_ED%BladeRootMotion(iB)%RotationVel(:,1) + y_ED%BladeRootMotion(iB)%Orientation(3,:,1)* (-rotDirDvr*bldMotion(2)) + y_ED%BladeRootMotion(iB)%RotationAcc(:,1) = y_ED%BladeRootMotion(iB)%RotationAcc(:,1) + y_ED%BladeRootMotion(iB)%Orientation(3,:,1)* (-rotDirDvr*bldMotion(3)) else print*,'Unknown blade motion type, should never happen' STOP endif - theta(3) = - wt%bld(iB)%pitch ! NOTE: sign, wind turbine convention ... + ! MirrorRotor: pitch is supplied in the CW convention and mirrored here, matching + ! the blade twist that was negated on read. + theta(3) = - rotDirDvr * wt%bld(iB)%pitch ! NOTE: sign, wind turbine convention ... orientation_loc = EulerConstruct(theta) y_ED%BladeRootMotion(iB)%Orientation(:,:,1) = matmul(orientation_loc, y_ED%BladeRootMotion(iB)%Orientation(:,:,1)) enddo From b999b46179319c0aa50aeae866973619b7af5a82 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Tue, 18 Aug 2026 22:30:23 -0600 Subject: [PATCH 05/66] Mirror the SED rotor and fix the RK4 HSS brake sign Adds MirrorRotor support to SimplifiedElastoDyn, the drivetrain half of the counter-clockwise rotor work. As in AeroDyn the mirror lives at the module boundary: the azimuth and rotor speed states are physical, while inputs and outputs stay in the rotor's own convention so a mirrored rotor turning its design direction still reads positive. RotDir is applied to the initial azimuth and rotor speed, to the generator torque on its way in, to the commanded blade pitch where it is turned into blade root geometry, and to the reported azimuth, speed, acceleration, torque and power. The HSS brake torque is deliberately left alone: it is already signed by the direction the shaft is turning, so a blanket sign flip would make the brake drive the rotor instead of stopping it. That last point exposed a latent bug. SED_AB4 and SED_ABM4 both sign the brake with SIGN(HSSBrTrqC, qdt), but SED_RK4 assigned the commanded torque directly, so the brake always acted in one fixed direction regardless of which way the shaft was turning. A clockwise rotor spinning forwards never notices, but ABM4 uses RK4 for startup, so a mirrored rotor was accelerated by its own brake for the first two steps before the multistep scheme took over and corrected the sign. RK4 now matches the other two integrators. Verified with a brake canary: the HSS brake case run clockwise and mirrored now produces bit-identical azimuth, rotor speed, rotor acceleration, generator speed and generator acceleration, and both runs decelerate 12 rpm to rest. The clockwise path is unchanged. sed_test_freewheel is bit-identical. sed_test_HSSbrk is identical while the rotor is turning and differs only after it has stopped, where the brake sign is now taken from a rotor speed of order 1e-18; that shifts the far digits of the existing stopped-state chatter by a relative 1e-10. Co-authored-by: GitHub Copilot Co-authored-by: Claude Opus 5 --- modules/simple-elastodyn/src/SED.f90 | 44 ++++++++++++------- modules/simple-elastodyn/src/SED_IO.f90 | 12 ++--- modules/simple-elastodyn/src/SED_Registry.txt | 2 + modules/simple-elastodyn/src/SED_Types.f90 | 8 ++++ .../src/driver/SED_Driver.f90 | 1 + .../src/driver/SED_Driver_Subs.f90 | 4 ++ .../src/driver/SED_Driver_Types.f90 | 1 + reg_tests/r-test | 2 +- 8 files changed, 53 insertions(+), 21 deletions(-) diff --git a/modules/simple-elastodyn/src/SED.f90 b/modules/simple-elastodyn/src/SED.f90 index 4e54d98b08..aa5749a851 100644 --- a/modules/simple-elastodyn/src/SED.f90 +++ b/modules/simple-elastodyn/src/SED.f90 @@ -165,7 +165,10 @@ subroutine SED_SetParameters(ErrStat3,ErrMsg3) p%GenDOF = InputFileData%GenDOF p%YawDOF = InputFileData%YawDOF p%InitYaw = InputFileData%NacYaw - p%InitAzimuth = InputFileData%Azimuth + p%RotDir = 1.0_ReKi + if (InitInp%MirrorRotor) p%RotDir = -1.0_ReKi + ! MirrorRotor: the azimuth state is physical, the input is in the CW convention. + p%InitAzimuth = p%RotDir * InputFileData%Azimuth ! geometry p%NumBl = InputFileData%NumBl @@ -215,8 +218,10 @@ subroutine Init_States(ErrStat3,ErrMsg3) call AllocAry( x%QDT, 1, 'x%QDT', ErrStat3, ErrMsg3); if (ErrStat3 >= AbortErrLev) return ! Set initial conditions - x%QT( DOF_Az) = InputFileData%Azimuth - x%QDT(DOF_Az) = InputFileData%RotSpeed + ! MirrorRotor: Azimuth and RotSpeed are supplied in the CW convention (RotSpeed is + ! validated non-negative) and mirrored here; the states themselves are physical. + x%QT( DOF_Az) = p%RotDir * InputFileData%Azimuth + x%QDT(DOF_Az) = p%RotDir * InputFileData%RotSpeed ! Unused states xd%DummyDiscreteState = 0.0_ReKi @@ -519,7 +524,7 @@ subroutine Init_InitY(ErrStat3,ErrMsg3) call AllocAry( InitOut%BlPitch, p%NumBl, 'InitOut%BlPitch', ErrStat3, ErrMsg3 ); if (errStat3 >= AbortErrLev) return InitOut%BlPitch = InputFileData%BlPitch - InitOut%RotSpeed = x%QDT(DOF_Az) + InitOut%RotSpeed = p%RotDir * x%QDT(DOF_Az) InitOut%PlatformPos(1:3) = real(y%PlatformPtMesh%Position(1:3,1), ReKi) + real(y%PlatformPtMesh%TranslationDisp(1:3,1), ReKi) theta(1:3) = GetSmllRotAngs(y%PlatformPtMesh%Orientation(1:3,1:3,1), ErrStat3, ErrMsg3); if (errStat3 >= AbortErrLev) return InitOut%PlatformPos(4:6) = real(theta, ReKi) @@ -842,7 +847,9 @@ subroutine SED_RK4( t, n, u, utimes, p, x, xd, z, OtherState, m, ErrStat, ErrMsg ! interpolate u to find u_interp = u(t) call SED_Input_ExtrapInterp( u, utimes, u_interp, t, ErrStat2, ErrMsg2 ); if (Failed()) return - OtherState%HSSBrTrq = u_interp%HSSBrTrqC + ! The brake opposes the direction of rotation, as in AB4/ABM4. Without the sign it + ! would drive a shaft that is turning backwards. + OtherState%HSSBrTrq = SIGN( u_interp%HSSBrTrqC, real(x%qdt(DOF_Az),ReKi) ) ! find xdot at t call SED_CalcContStateDeriv( t, u_interp, p, x, xd, z, OtherState, m, xdot, ErrStat2, ErrMsg2 ) @@ -987,7 +994,9 @@ subroutine FixHSSBrTq ( Integrator, u, p, x, OtherState, m, ErrStat, ErrMsg ) ! Find the force required to produce RqdQD2Az from the equations of ! motion using the new accelerations: - GenTrqLSS = p%GBoxRatio * u%GenTrq + ! MirrorRotor: GenTrq arrives in the CW convention, so RotDir puts it on the physical + ! shaft axis. HSSBrTrqC is already signed by the rotation direction and must not be. + GenTrqLSS = p%RotDir * p%GBoxRatio * u%GenTrq BrkTrqLSS = p%GBoxRatio * OtherState%HSSBrTrqC AeroTrq = dot_product(u%HubPtLoad%Moment(:,1), m%HubPt_X(1:3)) ! torque about hub X RqdFrcAz = RqdQD2Az * p%J_DT - AeroTrq + GenTrqLSS + BrkTrqLSS @@ -1051,8 +1060,8 @@ function SignLSSTrq( u, p, m ) real(ReKi) :: BrkTrqLSS ! HSS brake torque, expressed on LSS real(ReKi) :: AeroTrq ! AeroDynamic torque -- passed in on HubPt - GenTrqLSS = p%GBoxRatio * u%GenTrq - BrkTrqLSS = p%GBoxRatio * u%HSSBrTrqC + GenTrqLSS = p%RotDir * p%GBoxRatio * u%GenTrq + BrkTrqLSS = p%RotDir * p%GBoxRatio * u%HSSBrTrqC AeroTrq = dot_product(u%HubPtLoad%Moment(:,1), m%HubPt_X(1:3)) ! torque about hub X MomLPRot = AeroTrq - GenTrqLSS - BrkTrqLSS @@ -1308,6 +1317,7 @@ SUBROUTINE SED_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, real(ReKi) :: YawRotVel(3) real(ReKi) :: YawAng real(ReKi) :: AzRotVel(3) + real(ReKi) :: BlPitchPhys !< Blade pitch on the physical rotor integer(IntKi) :: i !< Generic counter logical :: CalcWriteOutput type(SED_ContinuousStateType) :: dxdt !< Derivatives of continuous states at t @@ -1404,7 +1414,9 @@ SUBROUTINE SED_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, R33(1:3,1:3) = SkewSymMat( y%BladeRootMotion(i)%Orientation(3,1:3,1) ) ! blade z-axis call Eye(Orient,ErrStat2,ErrMsg2); if (Failed()) return; ! Rodrigues formula for rotation about a vector (NOTE: BlPitch does not follow right hand rule) - Orient = Orient + sin(real(-u%BlPitchCom(i),R8Ki)) * R33 + (1-cos(real(-u%BlPitchCom(i),R8Ki))) * matmul(R33,R33) + ! MirrorRotor: BlPitchCom arrives in the CW convention, so mirror it here. + BlPitchPhys = p%RotDir * u%BlPitchCom(i) + Orient = Orient + sin(real(-BlPitchPhys,R8Ki)) * R33 + (1-cos(real(-BlPitchPhys,R8Ki))) * matmul(R33,R33) y%BladeRootMotion(i)%Orientation(1:3,1:3,1) = matmul(y%BladeRootMotion(i)%Orientation(1:3,1:3,1),transpose(Orient)) ! We don't have a blade pitching rate, so we will not include it here @@ -1416,15 +1428,17 @@ SUBROUTINE SED_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, !-------------------- ! Other outputs - y%LSSTipPxa = x%QT( DOF_Az) + ! MirrorRotor: the states are physical; these are reported in the rotor's own (CW) + ! convention, so a mirrored rotor turning its design direction still reads positive. + y%LSSTipPxa = p%RotDir * x%QT( DOF_Az) call Zero2TwoPi(y%LSSTipPxa) ! Modulo - y%RotSpeed = x%QDT(DOF_Az) - y%HSS_Spd = x%QDT(DOF_Az) * p%GBoxRatio + y%RotSpeed = p%RotDir * x%QDT(DOF_Az) + y%HSS_Spd = p%RotDir * x%QDT(DOF_Az) * p%GBoxRatio ! Rotor torque is the torque applied to the LSS shaft by the rotor. ! NOTE: this is equivalent to the reactionary torque of the generator due to its torque and inertia. - y%RotTrq = p%GBoxRatio * u%GenTrq + dxdt%QDT(DOF_Az) * RPS2RPM * p%GBoxRatio * p%GenIner + p%GBoxRatio * OtherState%HSSBrTrq + y%RotTrq = p%GBoxRatio * u%GenTrq + p%RotDir * (dxdt%QDT(DOF_Az) * RPS2RPM * p%GBoxRatio * p%GenIner + p%GBoxRatio * OtherState%HSSBrTrq) ! y%RotTrq = dot_product(u%HubPtLoad%Moment(:,1), m%HubPt_X(1:3)) - dxdt%QDT(DOF_Az) * RPS2RPM * p%RotIner ! this equation is somehow wrong. - y%RotPwr = x%QDT(DOF_Az) * y%RotTrq + y%RotPwr = p%RotDir * x%QDT(DOF_Az) * y%RotTrq ! Simply pass the yaw cammend through as the current yaw y%Yaw = u%YawPosCom @@ -1509,7 +1523,7 @@ SUBROUTINE SED_CalcContStateDeriv( t, u, p, x, xd, z, OtherState, m, dxdt, ErrSt !! - \f$Q_b = n_g Q_{b,\text{HSS}}\f$ is the HSS brake torque projected to the LSS !! if (p%GenDOF) then - GenTrqLSS = p%GBoxRatio * u%GenTrq + GenTrqLSS = p%RotDir * p%GBoxRatio * u%GenTrq BrkTrqLSS = p%GBoxRatio * OtherState%HSSBrTrq AeroTrq = dot_product(u%HubPtLoad%Moment(:,1), m%HubPt_X(1:3)) ! torque about hub X dxdt%QDT(DOF_Az) = real((AeroTrq - GenTrqLSS - BrkTrqLSS)/p%J_DT, R8Ki) diff --git a/modules/simple-elastodyn/src/SED_IO.f90 b/modules/simple-elastodyn/src/SED_IO.f90 index 083de3e903..3931cb27d5 100644 --- a/modules/simple-elastodyn/src/SED_IO.f90 +++ b/modules/simple-elastodyn/src/SED_IO.f90 @@ -309,17 +309,19 @@ subroutine Calc_WriteOutput( u, p, x, dxdt, y, m, ErrStat, ErrMsg, CalcWriteOutp if (.not. CalcWriteOutput) return ! Azimuth - m%AllOuts( Azimuth ) = x%QT( DOF_Az) + ! MirrorRotor: the states are physical; these channels report the rotor's own + ! convention, so a mirrored rotor reads the same as its CW twin. + m%AllOuts( Azimuth ) = p%RotDir * x%QT( DOF_Az) call Zero2TwoPi(m%AllOuts( Azimuth )) ! modulo m%AllOuts( Azimuth ) = m%AllOuts( Azimuth ) * R2D ! speed - m%AllOuts( RotSpeed ) = x%QDT(DOF_Az) * RPS2RPM - m%AllOuts( GenSpeed ) = x%QDT(DOF_Az) * RPS2RPM * p%GBoxRatio + m%AllOuts( RotSpeed ) = p%RotDir * x%QDT(DOF_Az) * RPS2RPM + m%AllOuts( GenSpeed ) = p%RotDir * x%QDT(DOF_Az) * RPS2RPM * p%GBoxRatio ! accel - m%AllOuts( RotAcc ) = dxdt%QDT(DOF_Az) * RPS2RPM - m%AllOuts( GenAcc ) = dxdt%QDT(DOF_Az) * RPS2RPM * p%GBoxRatio + m%AllOuts( RotAcc ) = p%RotDir * dxdt%QDT(DOF_Az) * RPS2RPM + m%AllOuts( GenAcc ) = p%RotDir * dxdt%QDT(DOF_Az) * RPS2RPM * p%GBoxRatio ! Yaw commands m%AllOuts( Yaw ) = y%Yaw * R2D diff --git a/modules/simple-elastodyn/src/SED_Registry.txt b/modules/simple-elastodyn/src/SED_Registry.txt index da9b22187c..587ca1f6fe 100644 --- a/modules/simple-elastodyn/src/SED_Registry.txt +++ b/modules/simple-elastodyn/src/SED_Registry.txt @@ -49,6 +49,7 @@ typedef ^ InitInputType CHARACTER(1024) RootName - - typedef ^ InitInputType LOGICAL Linearize - .false. - "this module cannot be linearized at present" - typedef ^ InitInputType LOGICAL UseInputFile - .TRUE. - "Supplied by Driver: .TRUE. if using a input file, .FALSE. if all inputs are being passed in by the caller" - typedef ^ InitInputType FileInfoType PassedFileData - - - "If we don't use the input file, pass everything through this" - +typedef ^ InitInputType LOGICAL MirrorRotor - .FALSE. - "Flag indicating the rotor rotation direction is mirrored (counter-clockwise viewed from upwind)" - # outputs from initialization: @@ -135,6 +136,7 @@ typedef ^ ParameterType R8Ki InitAzimuth - - typedef ^ ParameterType ReKi RotIner - - - "Hub inertia about teeter axis (2-blader) or rotor axis (3-blader)" "kg m^2" typedef ^ ParameterType ReKi GenIner - - - "Generator inertia about HSS" "kg m^2" typedef ^ ParameterType ReKi GBoxRatio - - - "Gearbox ratio" - +typedef ^ ParameterType ReKi RotDir - 1.0 - "Rotor rotation direction: +1 normal (CW viewed from upwind), -1 mirrored (CCW)" - typedef ^ ParameterType IntKi NumBl - - - "Number of blades on the turbine" - typedef ^ ParameterType ReKi TipRad - - - "Preconed blade-tip radius (distance from the rotor apex to the blade tip)" m typedef ^ ParameterType ReKi HubRad - - - "Preconed hub radius (distance from the rotor apex to the blade root)" m diff --git a/modules/simple-elastodyn/src/SED_Types.f90 b/modules/simple-elastodyn/src/SED_Types.f90 index ea94df58bd..06101b2c79 100644 --- a/modules/simple-elastodyn/src/SED_Types.f90 +++ b/modules/simple-elastodyn/src/SED_Types.f90 @@ -69,6 +69,7 @@ MODULE SED_Types LOGICAL :: Linearize = .false. !< this module cannot be linearized at present [-] LOGICAL :: UseInputFile = .TRUE. !< Supplied by Driver: .TRUE. if using a input file, .FALSE. if all inputs are being passed in by the caller [-] TYPE(FileInfoType) :: PassedFileData !< If we don't use the input file, pass everything through this [-] + LOGICAL :: MirrorRotor = .FALSE. !< Flag indicating the rotor rotation direction is mirrored (counter-clockwise viewed from upwind) [-] END TYPE SED_InitInputType ! ======================= ! ========= SED_InitOutputType ======= @@ -158,6 +159,7 @@ MODULE SED_Types REAL(ReKi) :: RotIner = 0.0_ReKi !< Hub inertia about teeter axis (2-blader) or rotor axis (3-blader) [kg m^2] REAL(ReKi) :: GenIner = 0.0_ReKi !< Generator inertia about HSS [kg m^2] REAL(ReKi) :: GBoxRatio = 0.0_ReKi !< Gearbox ratio [-] + REAL(ReKi) :: RotDir = 1.0 !< Rotor rotation direction: +1 normal (CW viewed from upwind), -1 mirrored (CCW) [-] INTEGER(IntKi) :: NumBl = 0_IntKi !< Number of blades on the turbine [-] REAL(ReKi) :: TipRad = 0.0_ReKi !< Preconed blade-tip radius (distance from the rotor apex to the blade tip) [m] REAL(ReKi) :: HubRad = 0.0_ReKi !< Preconed hub radius (distance from the rotor apex to the blade root) [m] @@ -355,6 +357,7 @@ subroutine SED_CopyInitInput(SrcInitInputData, DstInitInputData, CtrlCode, ErrSt call NWTC_Library_CopyFileInfoType(SrcInitInputData%PassedFileData, DstInitInputData%PassedFileData, CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return + DstInitInputData%MirrorRotor = SrcInitInputData%MirrorRotor end subroutine subroutine SED_DestroyInitInput(InitInputData, ErrStat, ErrMsg) @@ -380,6 +383,7 @@ subroutine SED_PackInitInput(RF, Indata) call RegPack(RF, InData%Linearize) call RegPack(RF, InData%UseInputFile) call NWTC_Library_PackFileInfoType(RF, InData%PassedFileData) + call RegPack(RF, InData%MirrorRotor) if (RegCheckErr(RF, RoutineName)) return end subroutine @@ -393,6 +397,7 @@ subroutine SED_UnPackInitInput(RF, OutData) call RegUnpack(RF, OutData%Linearize); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%UseInputFile); if (RegCheckErr(RF, RoutineName)) return call NWTC_Library_UnpackFileInfoType(RF, OutData%PassedFileData) ! PassedFileData + call RegUnpack(RF, OutData%MirrorRotor); if (RegCheckErr(RF, RoutineName)) return end subroutine subroutine SED_CopyInitOutput(SrcInitOutputData, DstInitOutputData, CtrlCode, ErrStat, ErrMsg) @@ -1049,6 +1054,7 @@ subroutine SED_CopyParam(SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg) DstParamData%RotIner = SrcParamData%RotIner DstParamData%GenIner = SrcParamData%GenIner DstParamData%GBoxRatio = SrcParamData%GBoxRatio + DstParamData%RotDir = SrcParamData%RotDir DstParamData%NumBl = SrcParamData%NumBl DstParamData%TipRad = SrcParamData%TipRad DstParamData%HubRad = SrcParamData%HubRad @@ -1120,6 +1126,7 @@ subroutine SED_PackParam(RF, Indata) call RegPack(RF, InData%RotIner) call RegPack(RF, InData%GenIner) call RegPack(RF, InData%GBoxRatio) + call RegPack(RF, InData%RotDir) call RegPack(RF, InData%NumBl) call RegPack(RF, InData%TipRad) call RegPack(RF, InData%HubRad) @@ -1165,6 +1172,7 @@ subroutine SED_UnPackParam(RF, OutData) call RegUnpack(RF, OutData%RotIner); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%GenIner); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%GBoxRatio); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%RotDir); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%NumBl); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%TipRad); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%HubRad); if (RegCheckErr(RF, RoutineName)) return diff --git a/modules/simple-elastodyn/src/driver/SED_Driver.f90 b/modules/simple-elastodyn/src/driver/SED_Driver.f90 index 900c7ea938..4e06b57e5f 100644 --- a/modules/simple-elastodyn/src/driver/SED_Driver.f90 +++ b/modules/simple-elastodyn/src/driver/SED_Driver.f90 @@ -238,6 +238,7 @@ PROGRAM SED_Driver InitInData%InputFile = Settings%SEDIptFileName InitInData%RootName = Settings%OutRootName + InitInData%MirrorRotor = Settings%MirrorRotor ! Initialize the module CALL SED_Init( InitInData, u(1), p, x, xd, z, OtherState, y, misc, TimeInterval, InitOutData, ErrStat, ErrMsg ) diff --git a/modules/simple-elastodyn/src/driver/SED_Driver_Subs.f90 b/modules/simple-elastodyn/src/driver/SED_Driver_Subs.f90 index 554526d1ff..9cf956fc6d 100644 --- a/modules/simple-elastodyn/src/driver/SED_Driver_Subs.f90 +++ b/modules/simple-elastodyn/src/driver/SED_Driver_Subs.f90 @@ -448,6 +448,10 @@ SUBROUTINE ParseDvrIptFile( DvrFileName, DvrFileInfo, DvrFlags, DvrSettings, Pro ! WrVTK -- writing VTK visualization files must be [0: none, 1: init only, 2: animation] call ParseVar( DvrFileInfo, CurLine, "WrVTK", DvrSettings%WrVTK, ErrStatTmp, ErrMsgTmp, UnEc ) + ! MirrorRotor -- run the rotor counter-clockwise viewed from upwind + call ParseVar( DvrFileInfo, CurLine, "MirrorRotor", DvrSettings%MirrorRotor, ErrStatTmp, ErrMsgTmp, UnEc ) + if (Failed()) return + !====== Case analysis =============================================================================== if ( EchoFileContents ) WRITE(UnEc, '(A)') DvrFileInfo%Lines(CurLine) ! Write section break to echo diff --git a/modules/simple-elastodyn/src/driver/SED_Driver_Types.f90 b/modules/simple-elastodyn/src/driver/SED_Driver_Types.f90 index 65b6ed4167..6f0eda31eb 100644 --- a/modules/simple-elastodyn/src/driver/SED_Driver_Types.f90 +++ b/modules/simple-elastodyn/src/driver/SED_Driver_Types.f90 @@ -65,6 +65,7 @@ module SED_Driver_Types type(ProgDesc) :: SEDProgInfo !< Program info for SED integer(IntKi) :: WrVTK !< Write VTK outputs [0: none, 1: init only, 2: animation] + logical :: MirrorRotor = .FALSE. !< Rotor rotation direction is mirrored (CCW viewed from upwind) integer(IntKi) :: VTK_tWidth !< width of the time field in the VTK character(1024) :: VTK_OutFileRoot !< Output root name for VTK end type SEDDriver_Settings diff --git a/reg_tests/r-test b/reg_tests/r-test index d1769de40a..dafd1172e5 160000 --- a/reg_tests/r-test +++ b/reg_tests/r-test @@ -1 +1 @@ -Subproject commit d1769de40a94e445bf62eddbe1fcdfc0b65f24d4 +Subproject commit dafd1172e5d2fa6959d6b75a045051803ecaff8f From 296322409fe5fd09a9ac827c85586cddc74fb984 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Tue, 18 Aug 2026 22:42:27 -0600 Subject: [PATCH 06/66] Wire up MirrorRotor and mirror the ElastoDyn rotor MirrorRotor already existed in the OpenFAST primary input file as a stub: it was read into p_FAST%MirrorRotor but never used. This connects it. The glue code now passes the per-rotor flag into the ElastoDyn and AeroDyn initialization inputs, and rejects the combinations that have not been worked through yet: linearization, the steady-state aero map solver, SimplifiedElastoDyn, BeamDyn, AeroDisk, ExtLoads and ServoDyn. AeroDyn adds two more of its own, for the OLAF free wake and the acoustics model. Each of these guards is removed as the corresponding module is done. ElastoDyn gets the same boundary treatment as AeroDyn and SED. The azimuth and rotor speed states are physical, so the initial azimuth, rotor speed and blade pitch are mirrored as they are read, and the structural twist is negated to match the aerodynamic twist that AeroDyn already negates. Blade one sits at QT(GeAz) + AzimB1Up + pi/2, so the azimuth initial condition keeps those offsets outside the mirror. On the drivetrain, the generator torque is converted from the ServoDyn convention onto the physical shaft and the high-speed shaft speed is reported in the rotor's own convention. As in SED the brake torque is left alone, since it is already signed by the direction the shaft is turning and mirroring the whole bracket would make it drive the rotor. MirrorRotor still defaults to false everywhere. 5MW_Land_DLL_WTurb and 5MW_Land_DLL_WTurb_SED remain bit-identical to their baselines. Co-authored-by: GitHub Copilot Co-authored-by: Claude Opus 5 --- modules/aerodyn/src/AeroDyn.f90 | 12 ++++++++++- modules/elastodyn/src/ElastoDyn.f90 | 21 +++++++++++++++----- modules/elastodyn/src/ElastoDyn_Registry.txt | 2 ++ modules/elastodyn/src/ElastoDyn_Types.f90 | 8 ++++++++ modules/openfast-library/src/FAST_Subs.f90 | 16 +++++++++++++++ 5 files changed, 53 insertions(+), 6 deletions(-) diff --git a/modules/aerodyn/src/AeroDyn.f90 b/modules/aerodyn/src/AeroDyn.f90 index 8cf674ff46..4f58429c6e 100644 --- a/modules/aerodyn/src/AeroDyn.f90 +++ b/modules/aerodyn/src/AeroDyn.f90 @@ -432,7 +432,17 @@ subroutine AD_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, InitOut do iR = 1, nRotors p%rotors(iR)%AeroProjMod = AeroProjMod(iR) p%rotors(iR)%RotDir = 1.0_ReKi - if (InitInp%rotors(iR)%MirrorRotor) p%rotors(iR)%RotDir = -1.0_ReKi + if (InitInp%rotors(iR)%MirrorRotor) then + p%rotors(iR)%RotDir = -1.0_ReKi + ! Not yet worked through for the free wake or the acoustics model. + if (InputFileData%Wake_Mod == WakeMod_FVW) then + call SetErrStat(ErrID_Fatal, 'MirrorRotor is not yet supported with the OLAF free-vortex-wake model (Wake_Mod=3).', ErrStat, ErrMsg, RoutineName) + end if + if (InputFileData%CompAA) then + call SetErrStat(ErrID_Fatal, 'MirrorRotor is not yet supported with the AeroAcoustics model.', ErrStat, ErrMsg, RoutineName) + end if + if (ErrStat >= AbortErrLev) return + end if call WrScr(' AeroDyn: projMod: '//trim(num2lstr(p%rotors(iR)%AeroProjMod))) call SetParameters( InitInp, InputFileData, InputFileData%rotors(iR), p%rotors(iR), p, ErrStat2, ErrMsg2 ) if (Failed()) return; diff --git a/modules/elastodyn/src/ElastoDyn.f90 b/modules/elastodyn/src/ElastoDyn.f90 index f087c68256..ed55ae17a6 100644 --- a/modules/elastodyn/src/ElastoDyn.f90 +++ b/modules/elastodyn/src/ElastoDyn.f90 @@ -1879,7 +1879,7 @@ SUBROUTINE ED_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) END IF END DO y%LSS_Spd = x%QDT(DOF_GeAz) - y%HSS_Spd = ABS(p%GBRatio)*x%QDT(DOF_GeAz) + y%HSS_Spd = p%RotDir*ABS(p%GBRatio)*x%QDT(DOF_GeAz) y%RotSpeed = x%QDT(DOF_GeAz) + x%QDT(DOF_DrTr) IF ( t > 0.0_DbKi ) THEN @@ -2753,6 +2753,10 @@ SUBROUTINE SetBladeParameters( p, BladeInData, BladeMeshData, ErrStat, ErrMsg ) end if + ! MirrorRotor: the blade is mirrored about the rotor XZ plane, so the structural twist + ! reverses along with the aerodynamic twist negated in AeroDyn. + p%ThetaS = p%RotDir * p%ThetaS + p%CThetaS = COS(REAL(p%ThetaS,R8Ki)) p%SThetaS = SIN(REAL(p%ThetaS,R8Ki)) @@ -3390,6 +3394,8 @@ SUBROUTINE SetPrimaryParameters( InitInp, p, InputFileData, ErrStat, ErrMsg ) p%PtfmXZIner = InputFileData%PtfmXZIner p%GBoxEff = InputFileData%GBoxEff p%GBRatio = InputFileData%GBRatio + p%RotDir = 1.0_ReKi + if (InitInp%MirrorRotor) p%RotDir = -1.0_ReKi p%DTTorSpr = InputFileData%DTTorSpr p%DTTorDmp = InputFileData%DTTorDmp @@ -3544,7 +3550,9 @@ SUBROUTINE SetPrimaryParameters( InitInp, p, InputFileData, ErrStat, ErrMsg ) !p%PtfmPDOF = InputFileData%PtfmPDOF !p%PtfmYDOF = InputFileData%PtfmYDOF !p%Azimuth = InputFileData%Azimuth - p%RotSpeed = InputFileData%RotSpeed + ! MirrorRotor: RotSpeed is supplied in the CW convention (validated non-negative) and + ! mirrored here; the state itself is the physical shaft speed about +x. + p%RotSpeed = p%RotDir * InputFileData%RotSpeed !p%TTDspFA = InputFileData%TTDspFA !p%TTDspSS = InputFileData%TTDspSS !p%PtfmSurge = InputFileData%PtfmSurge @@ -3605,7 +3613,7 @@ 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_BP(1:p%NumBl ) ) = p%RotDir * 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(). @@ -3633,7 +3641,7 @@ SUBROUTINE Init_ContStates( x, p, InputFileData, OtherState, ErrStat, ErrMsg ) !JASON: CHANGE THESE MOD() FUNCTIONS INTO MODULO() FUNCTIONS SO THAT YOU CAN ELIMINATE ADDING 360: ! x%QT (DOF_GeAz) = MOD( (InputFileData%Azimuth - p%AzimB1Up)*R2D + 270.0 + 360.0, 360.0 )*D2R ! Internal position of blade 1 - x%QT (DOF_GeAz) = REAL(InputFileData%Azimuth, R8Ki) - p%AzimB1Up - REAL(Piby2_D, R8Ki) + x%QT (DOF_GeAz) = p%RotDir * REAL(InputFileData%Azimuth, R8Ki) - p%AzimB1Up - REAL(Piby2_D, R8Ki) CALL Zero2TwoPi( x%QT (DOF_GeAz) ) x%QDT(DOF_GeAz) = p%RotSpeed ! Rotor speed in rad/sec. @@ -8235,7 +8243,10 @@ SUBROUTINE FillAugMat( p, x, CoordSys, u, HSSBrTrq, RtHSdat, AugMat ) ! Initialize the matrix: AugMat = 0.0 - GBoxTrq = ( u%GenTrq + HSSBrTrq )*ABS(p%GBRatio) ! bjj: do we use HSSBrTrqC or HSSBrTrq? + ! MirrorRotor: GenTrq arrives from ServoDyn in the CW convention and needs RotDir to put + ! it on the physical shaft. HSSBrTrq is already signed by the rotation direction + ! (SIGN(HSSBrTrqC, qdt) below), so mirroring the bracket would make the brake drive the rotor. + GBoxTrq = ( p%RotDir*u%GenTrq + HSSBrTrq )*ABS(p%GBRatio) ! bjj: do we use HSSBrTrqC or HSSBrTrq? DO K = 1,p%NumBl ! Loop through all blades diff --git a/modules/elastodyn/src/ElastoDyn_Registry.txt b/modules/elastodyn/src/ElastoDyn_Registry.txt index e0988d4c0d..94dc557ad4 100644 --- a/modules/elastodyn/src/ElastoDyn_Registry.txt +++ b/modules/elastodyn/src/ElastoDyn_Registry.txt @@ -26,6 +26,7 @@ typedef ^ InitInputType CHARACTER(1024) RootName - - - "RootName for writing out typedef ^ InitInputType ReKi Gravity - - - "Gravitational acceleration" m/s^2 typedef ^ InitInputType IntKi MHK - - - "MHK turbine type switch" - typedef ^ InitInputType ReKi WtrDpth - - - "Water depth" m +typedef ^ InitInputType LOGICAL MirrorRotor - .FALSE. - "Flag indicating the rotor rotation direction is mirrored (counter-clockwise viewed from upwind)" - typedef ^ InitInputType LOGICAL CompAeroMaps - .FALSE. - "flag to determine if ElastoDyn is computing aero maps (true) or running a normal simulation (false)" - typedef ^ InitInputType ReKi RotSpeed - - - "Rotor speed used when ElastoDyn is computing aero maps" "rad/s" @@ -748,6 +749,7 @@ typedef ^ ParameterType DbKi TStart - - - "Time to begin tabular output" typedef ^ ParameterType ReKi DTTorDmp - - - "Drivetrain torsional damper" typedef ^ ParameterType ReKi DTTorSpr - - - "Drivetrain torsional spring" typedef ^ ParameterType ReKi GBRatio - - - "Gearbox ratio" +typedef ^ ParameterType ReKi RotDir - 1.0 - "Rotor rotation direction: +1 normal (CW viewed from upwind), -1 mirrored (CCW)" typedef ^ ParameterType ReKi GBoxEff - - - "Gearbox efficiency" typedef ^ ParameterType ReKi RotSpeed - - - "Initial or fixed rotor speed" rad/s typedef ^ ParameterType CHARACTER(1024) RootName - - - "RootName for writing output files" diff --git a/modules/elastodyn/src/ElastoDyn_Types.f90 b/modules/elastodyn/src/ElastoDyn_Types.f90 index 6eb00b68c1..2a7bb9c062 100644 --- a/modules/elastodyn/src/ElastoDyn_Types.f90 +++ b/modules/elastodyn/src/ElastoDyn_Types.f90 @@ -45,6 +45,7 @@ MODULE ElastoDyn_Types REAL(ReKi) :: Gravity = 0.0_ReKi !< Gravitational acceleration [m/s^2] INTEGER(IntKi) :: MHK = 0_IntKi !< MHK turbine type switch [-] REAL(ReKi) :: WtrDpth = 0.0_ReKi !< Water depth [m] + LOGICAL :: MirrorRotor = .FALSE. !< Flag indicating the rotor rotation direction is mirrored (counter-clockwise viewed from upwind) [-] LOGICAL :: CompAeroMaps = .FALSE. !< flag to determine if ElastoDyn is computing aero maps (true) or running a normal simulation (false) [-] REAL(ReKi) :: RotSpeed = 0.0_ReKi !< Rotor speed used when ElastoDyn is computing aero maps [rad/s] END TYPE ED_InitInputType @@ -753,6 +754,7 @@ MODULE ElastoDyn_Types REAL(ReKi) :: DTTorDmp = 0.0_ReKi !< Drivetrain torsional damper [-] REAL(ReKi) :: DTTorSpr = 0.0_ReKi !< Drivetrain torsional spring [-] REAL(ReKi) :: GBRatio = 0.0_ReKi !< Gearbox ratio [-] + REAL(ReKi) :: RotDir = 1.0 !< Rotor rotation direction: +1 normal (CW viewed from upwind), -1 mirrored (CCW) [-] REAL(ReKi) :: GBoxEff = 0.0_ReKi !< Gearbox efficiency [-] REAL(ReKi) :: RotSpeed = 0.0_ReKi !< Initial or fixed rotor speed [rad/s] CHARACTER(1024) :: RootName !< RootName for writing output files [-] @@ -933,6 +935,7 @@ subroutine ED_CopyInitInput(SrcInitInputData, DstInitInputData, CtrlCode, ErrSta DstInitInputData%Gravity = SrcInitInputData%Gravity DstInitInputData%MHK = SrcInitInputData%MHK DstInitInputData%WtrDpth = SrcInitInputData%WtrDpth + DstInitInputData%MirrorRotor = SrcInitInputData%MirrorRotor DstInitInputData%CompAeroMaps = SrcInitInputData%CompAeroMaps DstInitInputData%RotSpeed = SrcInitInputData%RotSpeed end subroutine @@ -959,6 +962,7 @@ subroutine ED_PackInitInput(RF, Indata) call RegPack(RF, InData%Gravity) call RegPack(RF, InData%MHK) call RegPack(RF, InData%WtrDpth) + call RegPack(RF, InData%MirrorRotor) call RegPack(RF, InData%CompAeroMaps) call RegPack(RF, InData%RotSpeed) if (RegCheckErr(RF, RoutineName)) return @@ -977,6 +981,7 @@ subroutine ED_UnPackInitInput(RF, OutData) call RegUnpack(RF, OutData%Gravity); 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 + call RegUnpack(RF, OutData%MirrorRotor); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%CompAeroMaps); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%RotSpeed); if (RegCheckErr(RF, RoutineName)) return end subroutine @@ -5599,6 +5604,7 @@ subroutine ED_CopyParam(SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg) DstParamData%DTTorDmp = SrcParamData%DTTorDmp DstParamData%DTTorSpr = SrcParamData%DTTorSpr DstParamData%GBRatio = SrcParamData%GBRatio + DstParamData%RotDir = SrcParamData%RotDir DstParamData%GBoxEff = SrcParamData%GBoxEff DstParamData%RotSpeed = SrcParamData%RotSpeed DstParamData%RootName = SrcParamData%RootName @@ -6069,6 +6075,7 @@ subroutine ED_PackParam(RF, Indata) call RegPack(RF, InData%DTTorDmp) call RegPack(RF, InData%DTTorSpr) call RegPack(RF, InData%GBRatio) + call RegPack(RF, InData%RotDir) call RegPack(RF, InData%GBoxEff) call RegPack(RF, InData%RotSpeed) call RegPack(RF, InData%RootName) @@ -6331,6 +6338,7 @@ subroutine ED_UnPackParam(RF, OutData) call RegUnpack(RF, OutData%DTTorDmp); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%DTTorSpr); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%GBRatio); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%RotDir); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%GBoxEff); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%RotSpeed); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%RootName); if (RegCheckErr(RF, RoutineName)) return diff --git a/modules/openfast-library/src/FAST_Subs.f90 b/modules/openfast-library/src/FAST_Subs.f90 index 1567849764..7eac8123aa 100644 --- a/modules/openfast-library/src/FAST_Subs.f90 +++ b/modules/openfast-library/src/FAST_Subs.f90 @@ -354,6 +354,7 @@ SUBROUTINE FAST_InitializeAll( t_initial, m_Glue, p_FAST, y_FAST, m_FAST, ED, SE Init%InData_ED%Gravity = p_FAST%Gravity Init%InData_ED%MHK = p_FAST%MHK Init%InData_ED%WtrDpth = p_FAST%WtrDpth + Init%InData_ED%MirrorRotor = p_FAST%MirrorRotor(iRot) ! Call module initialization routine dt_module = p_FAST%DT @@ -670,6 +671,7 @@ SUBROUTINE FAST_InitializeAll( t_initial, m_Glue, p_FAST, y_FAST, m_FAST, ED, SE 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%rotors(iRot)%MirrorRotor = p_FAST%MirrorRotor(iRot) Init%InData_AD%InputFile = p_FAST%AeroFile Init%InData_AD%RootName = p_FAST%OutFileRoot Init%InData_AD%MHK = p_FAST%MHK @@ -2206,6 +2208,20 @@ SUBROUTINE ValidateInputData(p, m_FAST, ErrStat, ErrMsg) end if + ! Combinations not yet supported with a mirrored (counter-clockwise) rotor. Each of + ! these is removed as the corresponding module is worked through. + if (allocated(p%MirrorRotor)) then + if (any(p%MirrorRotor)) then + if (p%Linearize) CALL SetErrStat( ErrID_Fatal, 'MirrorRotor is not yet supported with linearization.', ErrStat, ErrMsg, RoutineName ) + if (p%CompAeroMaps) CALL SetErrStat( ErrID_Fatal, 'MirrorRotor is not yet supported with the steady-state (aero map) solver.', ErrStat, ErrMsg, RoutineName ) + if (p%CompElast == Module_SED) CALL SetErrStat( ErrID_Fatal, 'MirrorRotor is not yet supported with SimplifiedElastoDyn.', ErrStat, ErrMsg, RoutineName ) + if (p%CompElast == Module_BD) CALL SetErrStat( ErrID_Fatal, 'MirrorRotor is not yet supported with BeamDyn.', ErrStat, ErrMsg, RoutineName ) + if (p%CompAero == Module_ADsk) CALL SetErrStat( ErrID_Fatal, 'MirrorRotor is not yet supported with AeroDisk.', ErrStat, ErrMsg, RoutineName ) + if (p%CompAero == Module_ExtLd) CALL SetErrStat( ErrID_Fatal, 'MirrorRotor is not yet supported with ExtLoads.', ErrStat, ErrMsg, RoutineName ) + if (p%CompServo == Module_SrvD) CALL SetErrStat( ErrID_Fatal, 'MirrorRotor is not yet supported with ServoDyn.', ErrStat, ErrMsg, RoutineName ) + end if + end if + END SUBROUTINE ValidateInputData !---------------------------------------------------------------------------------------------------------------------------------- !> This routine initializes the output for the glue code, including writing the header for the primary output file. From a50195a590f69b58e014250202ed20f83b87b7c3 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Tue, 18 Aug 2026 23:03:19 -0600 Subject: [PATCH 07/66] Mirror the ElastoDyn blade pitch command The blade coordinate system is built from the commanded pitch, not from the pitch degree of freedom, so mirroring only the pitch DOF state left the blade geometry unmirrored whenever the pitch DOF is off, which is the usual case. The rotor then ran with the twist mirrored but the pitch not, which put every blade at the wrong angle of attack. With a rigid rotor the mirrored machine produced 12 percent more thrust than its clockwise twin. The blade root twist angle reported by AeroDyn made it obvious: 14.308 degrees clockwise against 12.308 mirrored, where 13.308 is the root twist and 1.0 the pitch, so the two were arriving with opposite relative signs instead of both negated. SetCoordSy now mirrors the commanded pitch, matching the pitch DOF state which is already physical. The AeroDyn summary confirmed the blade twist and swept-axis offset were already being negated correctly, so only the pitch needed changing. With a rigid rotor the two runs now agree exactly: thrust identical, torque exactly opposite. With the flexible blade and tower degrees of freedom enabled every one of the eighty output channels resolves to identical, exactly sign-flipped, a mirrored angle, or the numerical noise floor. The signs follow the mirror operator throughout, with tower base side-to-side force and fore-aft moment flipping while fore-aft force and side-to-side moment do not, and out-of-plane blade deflection matching while in-plane deflection flips. 5MW_Land_DLL_WTurb, 5MW_Land_DLL_WTurb_SED and 5MW_Land_BD_DLL_WTurb are all still bit-identical to their baselines. Co-authored-by: GitHub Copilot Co-authored-by: Claude Opus 5 --- modules/elastodyn/src/ElastoDyn.f90 | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/modules/elastodyn/src/ElastoDyn.f90 b/modules/elastodyn/src/ElastoDyn.f90 index ed55ae17a6..cd7504aaa7 100644 --- a/modules/elastodyn/src/ElastoDyn.f90 +++ b/modules/elastodyn/src/ElastoDyn.f90 @@ -2754,7 +2754,7 @@ SUBROUTINE SetBladeParameters( p, BladeInData, BladeMeshData, ErrStat, ErrMsg ) end if ! MirrorRotor: the blade is mirrored about the rotor XZ plane, so the structural twist - ! reverses along with the aerodynamic twist negated in AeroDyn. + ! reverses. This only orients the mode shapes; a rigid blade is unaffected. p%ThetaS = p%RotDir * p%ThetaS p%CThetaS = COS(REAL(p%ThetaS,R8Ki)) @@ -6265,8 +6265,10 @@ SUBROUTINE SetCoordSy( t, CoordSys, RtHSdat, BlPitch, p, x, ErrStat, ErrMsg ) 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) ) + ! MirrorRotor: the pitch command is in the CW convention (the pitch DOF state + ! above is already physical), so mirror it here. + CosPitch = COS( REAL(p%RotDir*BlPitch(K),R8Ki) ) + SinPitch = SIN( REAL(p%RotDir*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). From 8dd5377a0d7bffbbeae5a84e0df6eb96789b4490 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Tue, 18 Aug 2026 23:13:07 -0600 Subject: [PATCH 08/66] Keep the gearbox loss opposing power flow on a mirrored rotor The gearbox efficiency factor is selected from the sign of the low-speed shaft torque about the shaft axis. A mirrored rotor generates with a negative shaft torque, so that test classified generation as motoring and raised the gearbox factor to 1/GBoxEff instead of GBoxEff, turning the loss into a gain. The test now uses the torque in the rotor's own convention, which is the direction power actually flows. The high-speed shaft torque and power are reported in the rotor's own convention as well, so they are unchanged by the mirror. The low-speed shaft torque keeps its axis suffix and stays physical, so it flips. Verified with a free drivetrain, loose coupling and a 95 percent gearbox. Those all matter: the baseline gearbox is 100 percent efficient, which makes both branches of the factor identical, and SignLSSTrq is only reached from the loose-coupling integrators, so a tight-coupled run with a lossless gearbox cannot see this at all. With the fix reverted under those settings, 74 channels fail; with it in place every channel resolves. Co-authored-by: GitHub Copilot Co-authored-by: Claude Opus 5 --- modules/elastodyn/src/ElastoDyn.f90 | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/modules/elastodyn/src/ElastoDyn.f90 b/modules/elastodyn/src/ElastoDyn.f90 index cd7504aaa7..1fc99f0105 100644 --- a/modules/elastodyn/src/ElastoDyn.f90 +++ b/modules/elastodyn/src/ElastoDyn.f90 @@ -1268,8 +1268,10 @@ SUBROUTINE ED_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) ! Generator and High-Speed Shaft Loads: - m%AllOuts( HSShftTq) = m%AllOuts(LSShftMxa)*m%RtHS%GBoxEffFac/ABS(p%GBRatio) - m%AllOuts(HSShftPwr) = m%AllOuts( HSShftTq)*ABS(p%GBRatio)*x%QDT(DOF_GeAz) + ! MirrorRotor: LSShftMxa is the physical component about the shaft axis, while the + ! high-speed shaft torque and power are reported in the rotor's own convention. + m%AllOuts( HSShftTq) = p%RotDir*m%AllOuts(LSShftMxa)*m%RtHS%GBoxEffFac/ABS(p%GBRatio) + m%AllOuts(HSShftPwr) = m%AllOuts( HSShftTq)*ABS(p%GBRatio)*p%RotDir*x%QDT(DOF_GeAz) m%AllOuts(HSSBrTq) = OtherState%HSSBrTrq*0.001_ReKi @@ -6682,7 +6684,10 @@ FUNCTION SignLSSTrq( p, m ) ! MomLProt has now been found. Now dot this with e1 to get the ! low-speed shaft torque and take the SIGN of the result: - SignLSSTrq = NINT( SIGN( 1.0_R8Ki, DOT_PRODUCT( MomLPRot, m%CoordSys%e1 ) ) ) + ! MirrorRotor: the gearbox efficiency factor depends on which way power flows, not + ! on the sign of the torque about +x. A mirrored rotor generates with a negative + ! shaft torque, so without RotDir the loss would be inverted into a gain. + SignLSSTrq = NINT( SIGN( 1.0_R8Ki, p%RotDir*DOT_PRODUCT( MomLPRot, m%CoordSys%e1 ) ) ) END FUNCTION SignLSSTrq !---------------------------------------------------------------------------------------------------------------------------------- From fd536f5f95793579473fcf81a62a545f6fe196ea Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Tue, 18 Aug 2026 23:24:44 -0600 Subject: [PATCH 09/66] Split the ElastoDyn shaft-axis output aliases Several ElastoDyn channel names share one AllOuts slot even though they mean different things once a rotor can be mirrored. RotSpeed and LSSTipVxa were the same number, as were Azimuth and LSSTipPxa, RotAccel and LSSTipAxa, and RotTorq, LSShftTq and LSShftMxa. A name carrying an explicit axis suffix should report the physical component, while a name describing a rotor or drivetrain quantity should report it as the rotor experiences it. Four AllOuts slots are added for the rotor-convention channels and the five affected names are pointed at them. The names, units and ordering of the parameter tables are untouched, so the three parallel arrays keep their length and alphabetical ordering; only the index array changes. Generator speed and acceleration move to the rotor convention too, since the generator side stays positive whichever way the rotor was built. For a clockwise rotor RotDir is +1 and every one of these is numerically identical to what it was, so no existing deck or baseline changes. The split only becomes visible when MirrorRotor is set. The three parameter tables are indexed in parallel with nothing in the build checking they agree, so a misalignment would silently report the wrong channel. tools/check_ed_outparams.py parses all three out of the source and verifies the lengths match, the names stay sorted and unique, and every index symbol is declared and within MaxOutPts. Mirrored against the clockwise pair, RotSpeed, RotAccel, Azimuth, RotTorq, LSShftTq, HSShftTq, GenSpeed, GenAccel, RotPwr and RotThrust now all read identically, while LSShftMxa, LSSTipVxa, LSSTipAxa and LSSGagMxa flip and LSSTipPxa and LSSGagPxa mirror as angles. Rigid, flexible and free-drivetrain runs all resolve completely. Four regression cases including an offshore one stay bit-identical. Co-authored-by: GitHub Copilot Co-authored-by: Claude Opus 5 --- modules/elastodyn/src/ElastoDyn.f90 | 25 ++++++++++++++++++------- modules/elastodyn/src/ElastoDyn_IO.f90 | 10 +++++++++- 2 files changed, 27 insertions(+), 8 deletions(-) diff --git a/modules/elastodyn/src/ElastoDyn.f90 b/modules/elastodyn/src/ElastoDyn.f90 index 1fc99f0105..0f0ebb9ef3 100644 --- a/modules/elastodyn/src/ElastoDyn.f90 +++ b/modules/elastodyn/src/ElastoDyn.f90 @@ -971,10 +971,20 @@ SUBROUTINE ED_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) m%AllOuts( LSSTipVxa) = ( x%QDT (DOF_GeAz) + x%QDT (DOF_DrTr) )*RPS2RPM m%AllOuts( LSSTipAxa) = ( m%QD2T(DOF_GeAz) + m%QD2T(DOF_DrTr) )*R2D + + ! Rotor-convention counterparts: azimuth increases and speed is positive while the + ! rotor turns its design direction, whichever way it was built. + m%AllOuts( AzimuthRC) = p%RotDir*y%LSSTipPxa + if (.not. m%IgnoreMod) CALL Zero2TwoPi(m%AllOuts(AzimuthRC)) + m%AllOuts( AzimuthRC) = m%AllOuts(AzimuthRC)*R2D + m%AllOuts( RotSpeedRC) = p%RotDir*m%AllOuts(LSSTipVxa) + m%AllOuts( RotAccelRC) = p%RotDir*m%AllOuts(LSSTipAxa) m%AllOuts( LSSGagVxa) = x%QDT (DOF_GeAz) *RPS2RPM m%AllOuts( LSSGagAxa) = m%QD2T(DOF_GeAz) *R2D - m%AllOuts( HSShftV) = ABS(p%GBRatio)*m%AllOuts(LSSGagVxa) - m%AllOuts( HSShftA) = ABS(p%GBRatio)*m%AllOuts(LSSGagAxa) + ! MirrorRotor: the generator side keeps its own convention, so these stay positive + ! while the rotor turns its design direction (CONVENTIONS section 4). + m%AllOuts( HSShftV) = p%RotDir*ABS(p%GBRatio)*m%AllOuts(LSSGagVxa) + m%AllOuts( HSShftA) = p%RotDir*ABS(p%GBRatio)*m%AllOuts(LSSGagAxa) !IF ( .NOT. EqualRealNos( m%AllOuts(WindVxi), 0.0_ReKi ) ) THEN ! .TRUE. if the denominator in the following equation is not zero. ! m%AllOuts(TipSpdRat) = ( x%QDT (DOF_GeAz) + x%QDT (DOF_DrTr) )*p%AvgNrmTpRd / m%AllOuts( WindVxi) @@ -1221,6 +1231,7 @@ SUBROUTINE ED_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) m%AllOuts(LSShftFys) = -DOT_PRODUCT( FrcPRot, m%CoordSys%c3 ) m%AllOuts(LSShftFzs) = DOT_PRODUCT( FrcPRot, m%CoordSys%c2 ) m%AllOuts(LSShftMxa) = DOT_PRODUCT( MomLPRot, m%CoordSys%e1 ) + m%AllOuts(RotTorqRC) = p%RotDir*m%AllOuts(LSShftMxa) m%AllOuts(LSSTipMya) = DOT_PRODUCT( MomLPRot, m%CoordSys%e2 ) m%AllOuts(LSSTipMza) = DOT_PRODUCT( MomLPRot, m%CoordSys%e3 ) m%AllOuts(LSSTipMys) = -DOT_PRODUCT( MomLPRot, m%CoordSys%c3 ) @@ -4032,14 +4043,14 @@ SUBROUTINE SetOutParam(OutList, p, ErrStat, ErrMsg ) "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 , & + AzimuthRC , 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 , & + LSShftFza , LSShftFzs , LSShftMxa , LSShftMxa , RotPwr , RotTorqRC , LSSTipAxa , & LSSTipAxa , LSSTipAxa , LSSTipMya , LSSTipMys , LSSTipMza , LSSTipMzs , LSSTipPxa , & LSSTipPxa , LSSTipPxa , LSSTipVxa , LSSTipVxa , LSSTipVxa , YawPzn , YawAzn , & YawPzn , YawVzn , NcIMURAxs , NcIMURAys , NcIMURAzs , NcIMURVxs , NcIMURVys , & @@ -4070,9 +4081,9 @@ SUBROUTINE SetOutParam(OutList, p, ErrStat, ErrMsg ) 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 , & + RootMzc1 , RootMzc2 , RootMzc3 , RootMzc1 , RootMzc2 , RootMzc3 , RotAccelRC , & + RotFurlP , RotFurlA , RotFurlP , RotFurlV , RotPwr , RotSpeedRC , TeetAya , & + TeetPya , TeetVya , LSShftFxa , RotTorqRC , Spn1ALgxb1 , Spn1ALgxb2 , Spn1ALgxb3 , & Spn1ALgyb1 , Spn1ALgyb2 , Spn1ALgyb3 , Spn1ALgzb1 , Spn1ALgzb2 , Spn1ALgzb3 , Spn1ALxb1 , & Spn1ALxb2 , Spn1ALxb3 , Spn1ALyb1 , Spn1ALyb2 , Spn1ALyb3 , Spn1ALzb1 , Spn1ALzb2 , & Spn1ALzb3 , Spn1FLxb1 , Spn1FLxb2 , Spn1FLxb3 , Spn1FLyb1 , Spn1FLyb2 , Spn1FLyb3 , & diff --git a/modules/elastodyn/src/ElastoDyn_IO.f90 b/modules/elastodyn/src/ElastoDyn_IO.f90 index 33996cd46f..6088334191 100644 --- a/modules/elastodyn/src/ElastoDyn_IO.f90 +++ b/modules/elastodyn/src/ElastoDyn_IO.f90 @@ -1243,9 +1243,17 @@ MODULE ElastoDyn_Parameters INTEGER(IntKi), PARAMETER :: QD2_P = 1002 INTEGER(IntKi), PARAMETER :: QD2_Y = 1003 + ! Rotor-convention counterparts of the shaft-axis channels. These report the + ! quantity as the rotor experiences it, so a mirrored rotor turning its design + ! direction still reads positive. Identical to the shaft-axis slots when RotDir=+1. + INTEGER(IntKi), PARAMETER :: AzimuthRC = 1004 + INTEGER(IntKi), PARAMETER :: RotSpeedRC = 1005 + INTEGER(IntKi), PARAMETER :: RotAccelRC = 1006 + INTEGER(IntKi), PARAMETER :: RotTorqRC = 1007 + ! The maximum number of output channels which can be output by the code. - INTEGER(IntKi), PARAMETER :: MaxOutPts = 1003 + INTEGER(IntKi), PARAMETER :: MaxOutPts = 1007 !End of code generated by Matlab script Write_ChckOutLst ! =================================================================================================== From fbc56121745accb5baa510e1af83dcb23a232948 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Tue, 18 Aug 2026 23:41:35 -0600 Subject: [PATCH 10/66] Document mirrored rotors Adds docs/source/user/glue-code/mirror_rotor.rst covering what MirrorRotor does, the two output conventions and why they differ, the measured sign table, the current limitations, and how the mirror is verified. The sign table is measured rather than asserted: it comes from running the same model clockwise and mirrored and comparing every output channel. The note that mirroring reverses the blade sweep order, so blade 2 of one rotor corresponds to blade 3 of the other under non-axisymmetric inflow, is there because that is an easy way to misread a comparison. Co-authored-by: GitHub Copilot Co-authored-by: Claude Opus 5 --- docs/source/user/glue-code/index.rst | 1 + docs/source/user/glue-code/mirror_rotor.rst | 205 ++++++++++++++++++++ 2 files changed, 206 insertions(+) create mode 100644 docs/source/user/glue-code/mirror_rotor.rst diff --git a/docs/source/user/glue-code/index.rst b/docs/source/user/glue-code/index.rst index cebb573088..3186107aff 100644 --- a/docs/source/user/glue-code/index.rst +++ b/docs/source/user/glue-code/index.rst @@ -15,4 +15,5 @@ the glue code from a user and module-developer perspective. modvar modglue solver + mirror_rotor linearization diff --git a/docs/source/user/glue-code/mirror_rotor.rst b/docs/source/user/glue-code/mirror_rotor.rst new file mode 100644 index 0000000000..b021dcc545 --- /dev/null +++ b/docs/source/user/glue-code/mirror_rotor.rst @@ -0,0 +1,205 @@ +.. _glue-code-mirror-rotor: + +Mirrored (counter-clockwise) rotors +=================================== + +By convention an OpenFAST turbine rotor turns **clockwise when viewed from +upwind**. Setting ``MirrorRotor = T`` in the main OpenFAST input file runs the +same turbine as its **mirror image**, so the rotor turns **counter-clockwise +viewed from upwind**, without changing any of the input files that describe it. + +.. contents:: + :local: + :depth: 2 + +.. _glue-code-mirror-rotor-input: + +User input +---------- + +``MirrorRotor`` is read from the **Feature Switches and Flags** section of the +main OpenFAST input file (``*.fst``) and holds one flag per rotor: + +.. code-block:: text + + 1 NRotors - Number of rotors in turbine (-) + F MirrorRotor - Flag to reverse rotor rotation direction [1 to NRotors] {F=Normal, T=Mirror} + +Nothing else changes. The ElastoDyn, AeroDyn and blade input files, the airfoil +polars and the controller are all supplied exactly as they would be for the +clockwise machine, and the turbine described by those files is mirrored +internally. + +Airfoil tables in particular are used **verbatim** — there is no polar +transformation, and the airfoil coordinate files are not modified. + +.. _glue-code-mirror-rotor-concept: + +What the flag does +------------------ + +Mirroring is the reflection :math:`S = \mathrm{diag}(1, -1, 1)` about the rotor +:math:`xz` plane. Under that reflection + +.. math:: + + \mathbf{p}' = S\,\mathbf{p}, \qquad + \mathbf{v}' = S\,\mathbf{v}, \qquad + \boldsymbol{\omega}' = -S\,\boldsymbol{\omega}, \qquad + R' = S\,R\,S + +for positions, true vectors such as force and velocity, pseudovectors such as +moment and angular velocity, and direction cosine matrices respectively. + +The reflection is applied **at module boundaries only**. The physics kernels — +the blade-element momentum solver, the unsteady aerodynamics and dynamic wake +models, the airfoil interpolation, and the structural finite elements — are +never told the rotor is mirrored. They continue to solve the equivalent +clockwise problem, which is why the polars are used unchanged and why the +angle of attack, inflow angle and lift and drag coefficients come out +numerically identical to the clockwise machine. + +Quantities crossing a boundary are converted on the way in and back on the way +out. Inside ElastoDyn the azimuth and rotor speed states are the **physical** +ones, so a mirrored rotor really does have a negative shaft speed about the +:math:`+x` axis. + +.. _glue-code-mirror-rotor-conventions: + +Output conventions +------------------ + +Two families of output channel behave differently, and the distinction matters +only for a mirrored rotor. + +**Channels named after a rotor or drivetrain quantity** report it in the +**rotor's own convention** — positive when the rotor turns the way it was +designed to turn, whichever way that is. ``RotSpeed`` is positive for a +normally operating rotor whether or not it is mirrored, and negative only when +the rotor is genuinely running backwards. + +**Channels carrying an explicit axis suffix** (``*Mxa``, ``*Vxa``, ``*Axa``, +``*Pxa`` and their ``*xs`` counterparts) report the **physical** component about +that axis, so they change sign under the mirror. + +Several names used to be aliases of a single value and are now separate +channels. For a clockwise rotor the two are numerically identical, so no +existing model or output file changes. + +.. list-table:: + :header-rows: 1 + :widths: 25 25 50 + + * - Rotor convention + - Physical + - Quantity + * - ``RotSpeed`` + - ``LSSTipVxa``, ``LSSTipVxs``, ``LSSTipV`` + - Rotor angular speed + * - ``RotAccel`` + - ``LSSTipAxa``, ``LSSTipAxs``, ``LSSTipA`` + - Rotor angular acceleration + * - ``Azimuth`` + - ``LSSTipPxa``, ``LSSTipPxs``, ``LSSTipP`` + - Rotor azimuth + * - ``RotTorq``, ``LSShftTq`` + - ``LSShftMxa``, ``LSShftMxs``, ``LSSGagMxa``, ``LSSGagMxs`` + - Low-speed shaft torque + +``GenSpeed``, ``GenAccel``, ``HSShftV``, ``HSShftA``, ``HSShftTq`` and +``HSShftPwr`` follow the rotor convention, so the generator side reads positive +during normal operation regardless of rotation direction. ``RotPwr`` and +``RotThrust`` are unchanged by the mirror: power is a product of two quantities +that both flip, and thrust is along the mirror axis. + +.. _glue-code-mirror-rotor-signs: + +Measured sign table +------------------- + +The table below is **measured**, not asserted. It is produced by running the +same model with ``MirrorRotor = F`` and ``MirrorRotor = T`` and comparing every +output channel. Note that mirroring reverses the order in which the blades +sweep past a given point, so under non-axisymmetric inflow — shear, yaw, or +shaft tilt — blade 2 of the mirrored rotor corresponds to blade 3 of the +clockwise one. + +.. list-table:: + :header-rows: 1 + :widths: 20 80 + + * - Behaviour + - Channels + * - Identical + - ``RotSpeed``, ``RotAccel``, ``Azimuth``, ``RotTorq``, ``LSShftTq``, + ``GenSpeed``, ``GenAccel``, ``HSShftTq``, ``HSShftPwr``, ``RotPwr``, + ``RotThrust``, ``LSShftFxa``, ``LSShftFza``, ``LSSTipMya``, + ``YawBrFxp``, ``YawBrFzp``, ``YawBrMyp``, ``TwrBsFxt``, ``TwrBsMyt``, + ``OoPDefl*``, ``TipDxc*``, ``TipDzc*``, ``RootFxc*``, ``RootFzc*``, + ``RootMyc*``, and the AeroDyn ``*Alpha``, ``*Theta``, ``*Phi``, ``*Cl``, + ``*Cd``, ``*Fn`` families + * - Sign-flipped + - ``LSShftMxa``, ``LSSTipVxa``, ``LSSTipAxa``, ``LSSGagMxa``, + ``LSShftFya``, ``LSSTipMza``, ``YawBrFyp``, ``YawBrMxp``, ``YawBrMzp``, + ``TwrBsFyt``, ``TwrBsMxt``, ``TwrBsMzt``, ``IPDefl*``, ``TipDyc*``, + ``RootFyc*``, ``RootMxc*``, ``RootMzc*``, and the AeroDyn ``*Ft``, + ``*Cy``, ``*Vindy`` families + * - Mirrored angle + - ``LSSTipPxa``, ``LSSGagPxa`` + +.. _glue-code-mirror-rotor-limits: + +Limitations +----------- + +``MirrorRotor = T`` currently produces a fatal error when combined with any of +the following. Each restriction is removed as that part of the code is worked +through. + +.. list-table:: + :header-rows: 1 + :widths: 35 65 + + * - Not yet supported with + - Notes + * - Linearization + - ``Linearize = T`` + * - Steady-state solver + - ``CompAeroMaps = T`` + * - BeamDyn + - ``CompElast = 2`` + * - SimplifiedElastoDyn + - ``CompElast = 3`` + * - AeroDisk, ExtLoads + - ``CompAero = 1`` or ``3`` + * - ServoDyn + - ``CompServo = 1`` + * - OLAF free vortex wake + - ``Wake_Mod = 3`` in the AeroDyn input file + * - AeroAcoustics + - ``CompAA = True`` in the AeroDyn input file + +Because ServoDyn is not yet supported, a mirrored rotor currently runs without a +controller, at fixed or freely accelerating rotor speed. + +.. _glue-code-mirror-rotor-verification: + +Verification +------------ + +The mirror is verified by running a model twice, once clockwise and once +mirrored, and requiring **every** output channel to resolve to one of: identical, +exactly sign-flipped, a mirrored angle, or below the numerical noise floor. +Anything else indicates that two quantities have been combined while expressed in +different frames. + +The check is repeated across a matrix of conditions, since any single condition +leaves most of the sign map untested — rigid and flexible blades, fixed and free +drivetrain, vertical shear, positive and negative nacelle yaw, fixed and free +yaw, and combinations of those. At the AeroDyn module level the same comparison +is run over blade pitch, wind speed, tip-speed ratio, the propeller-brake state, +shaft tilt, precone, both BEM models, dynamic wake, and four unsteady-aerodynamic +models. + +For a clockwise rotor every mirror-related expression reduces to a multiplication +by ``+1``, so existing regression baselines reproduce bit-for-bit. From 85066a7412f997064cfea47fc4e4278b94e78bd2 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Wed, 19 Aug 2026 01:15:37 -0600 Subject: [PATCH 11/66] Register the mirrored-rotor regression pair Adds 5MW_Land_noDLL_Steady_CW and 5MW_Land_noDLL_Steady_MirrorRotor to the regression suite under a new mirrorrotor label, so the pair can be run on its own while a mirrored rotor is still being worked through. Co-authored-by: GitHub Copilot Co-authored-by: Claude Opus 5 --- reg_tests/CTestList.cmake | 2 ++ reg_tests/r-test | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/reg_tests/CTestList.cmake b/reg_tests/CTestList.cmake index c49fca12f4..ddcefb9c1c 100644 --- a/reg_tests/CTestList.cmake +++ b/reg_tests/CTestList.cmake @@ -349,6 +349,8 @@ of_regression("SWRT_YFree_VS_EDG01" "openfast;elastodyn;aerod of_regression("SWRT_YFree_VS_EDC01" "openfast;elastodyn;aerodyn;servodyn") of_regression("SWRT_YFree_VS_WTurb" "openfast;elastodyn;aerodyn;servodyn") of_regression("5MW_Land_DLL_WTurb" "openfast;elastodyn;aerodyn;servodyn") +of_regression("5MW_Land_noDLL_Steady_CW" "openfast;elastodyn;aerodyn;mirrorrotor") +of_regression("5MW_Land_noDLL_Steady_MirrorRotor" "openfast;elastodyn;aerodyn;mirrorrotor") 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") diff --git a/reg_tests/r-test b/reg_tests/r-test index dafd1172e5..6323a42f82 160000 --- a/reg_tests/r-test +++ b/reg_tests/r-test @@ -1 +1 @@ -Subproject commit dafd1172e5d2fa6959d6b75a045051803ecaff8f +Subproject commit 6323a42f8264ef39044389c3fd2e6835f62ba35d From 8c08fbf05953b0ff7f2e79e222bd7212127428fc Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Wed, 19 Aug 2026 01:36:38 -0600 Subject: [PATCH 12/66] Mirror the BeamDyn blade for counter-clockwise rotors BeamDyn describes a blade by its key-point geometry and a 6x6 sectional mass and stiffness matrix. Mirroring the blade about its local x-z plane reflects y, which negates the key-point y offset and the twist, and transforms the matrices by T*M*T^T with T = diag(1,-1,1,-1,1,-1). The theta entries pick up a sign because rotations are pseudovectors. In practice every matrix entry flips exactly when one of its indices is in {2,4,6}. The transform is applied between reading the input and validating it, so the polar-inertia check runs against the mirrored blade. That check compares mass0(6,6) against mass0(4,4) + mass0(5,5), all diagonal entries, which the transform leaves alone. Note the twist stored on read is already the negative of the value in the file, so negating it here leaves it equal to the file value rather than doubly negated. A unit test covers the transform directly: that applying it twice is the identity, that entries flip exactly when one index is in {2,4,6}, that the polar-inertia constraint survives, and that key points reflect in y and reverse twist while the x and z offsets are untouched. Coupled, a mirrored BeamDyn rotor now resolves cleanly against its clockwise twin, including the BeamDyn root and tip channels: the x and z forces, the y moment and the x and z deflections match, while the y force, the x and z moments and the y deflection flip. This holds with steady inflow, shear, yaw and a free drivetrain. BeamDyn's guard rail is removed. The clockwise path is unchanged and 5MW_Land_BD_DLL_WTurb and 5MW_Land_BD_DLL_WTurb_StC stay bit-identical. Co-authored-by: GitHub Copilot Co-authored-by: Claude Opus 5 --- modules/beamdyn/src/BeamDyn.f90 | 2 + modules/beamdyn/src/BeamDyn_IO.f90 | 48 ++++++ modules/beamdyn/src/BeamDyn_Types.f90 | 4 + modules/beamdyn/src/Registry_BeamDyn.txt | 2 +- modules/beamdyn/tests/beamdyn_utest.F90 | 2 + .../beamdyn/tests/test_BD_MirrorBladeData.F90 | 142 ++++++++++++++++++ modules/openfast-library/src/FAST_Subs.f90 | 2 +- unit_tests/CMakeLists.txt | 1 + 8 files changed, 201 insertions(+), 2 deletions(-) create mode 100644 modules/beamdyn/tests/test_BD_MirrorBladeData.F90 diff --git a/modules/beamdyn/src/BeamDyn.f90 b/modules/beamdyn/src/BeamDyn.f90 index 65791d3b43..e89fb80327 100644 --- a/modules/beamdyn/src/BeamDyn.f90 +++ b/modules/beamdyn/src/BeamDyn.f90 @@ -117,6 +117,8 @@ SUBROUTINE BD_Init( InitInp, u, p, x, xd, z, OtherState, y, MiscVar, Interval, I CALL DispNVD( BeamDyn_Ver ) CALL BD_ReadInput(InitInp%InputFile,InputFileData,InitInp%RootName,Interval,ErrStat2,ErrMsg2); if (Failed()) return + ! Mirrored before validating, so the validator also checks the mirrored blade. + if (InitInp%MirrorRotor) CALL BD_MirrorBladeData( InputFileData ) CALL BD_ValidateInputData( InitInp, InputFileData, ErrStat2, ErrMsg2 ); if (Failed()) return diff --git a/modules/beamdyn/src/BeamDyn_IO.f90 b/modules/beamdyn/src/BeamDyn_IO.f90 index 3ac90b1a52..b8503f2c57 100644 --- a/modules/beamdyn/src/BeamDyn_IO.f90 +++ b/modules/beamdyn/src/BeamDyn_IO.f90 @@ -508,6 +508,54 @@ MODULE BeamDyn_IO CONTAINS !---------------------------------------------------------------------------------------------------------------------------------- +!> Mirror the blade description about its local x-z plane, so a deck written for a +!! clockwise rotor describes the counter-clockwise mirror image of the same blade. +!! +!! The sectional degrees of freedom are ordered [u_x, u_y, u_z, theta_x, theta_y, theta_z]. +!! Reflecting y negates u_y and, because rotations are pseudovectors, theta_x and theta_z, +!! giving T = diag(1,-1,1,-1,1,-1). The 6x6 matrices transform as T*M*T^T, which in +!! practice flips every entry with exactly one index in {2,4,6}. T is its own inverse, so +!! applying this twice returns the original blade. +!! +!! Diagonal entries never flip, so the mass0(6,6) = mass0(4,4) + mass0(5,5) check in +!! BD_ValidateInputData still holds afterwards. +SUBROUTINE BD_MirrorBladeData( InputFileData ) + + TYPE(BD_InputFile), INTENT(INOUT) :: InputFileData !< Data stored in the module's input file + + REAL(BDKi), PARAMETER :: T(6) = (/ 1.0_BDKi, -1.0_BDKi, 1.0_BDKi, -1.0_BDKi, 1.0_BDKi, -1.0_BDKi /) + INTEGER(IntKi) :: i, j, k + + ! Key points: reflect the y offset and the twist. Note the twist stored here is + ! already the negative of the value in the file (see BD_ReadBladeFileInput), so this + ! leaves it equal to the file value rather than doubly negated. + if (allocated(InputFileData%kp_coordinate)) then + InputFileData%kp_coordinate(:,2) = -InputFileData%kp_coordinate(:,2) + InputFileData%kp_coordinate(:,4) = -InputFileData%kp_coordinate(:,4) + end if + + if (allocated(InputFileData%InpBl%stiff0)) then + do k = 1,size(InputFileData%InpBl%stiff0,3) + do j = 1,6 + do i = 1,6 + InputFileData%InpBl%stiff0(i,j,k) = T(i)*T(j)*InputFileData%InpBl%stiff0(i,j,k) + end do + end do + end do + end if + + if (allocated(InputFileData%InpBl%mass0)) then + do k = 1,size(InputFileData%InpBl%mass0,3) + do j = 1,6 + do i = 1,6 + InputFileData%InpBl%mass0(i,j,k) = T(i)*T(j)*InputFileData%InpBl%mass0(i,j,k) + end do + end do + end do + end if + +END SUBROUTINE BD_MirrorBladeData +!---------------------------------------------------------------------------------------------------------------------------------- SUBROUTINE BD_ReadInput(InputFileName,InputFileData,OutFileRoot, Default_DT,ErrStat,ErrMsg) ! Passed Variables: diff --git a/modules/beamdyn/src/BeamDyn_Types.f90 b/modules/beamdyn/src/BeamDyn_Types.f90 index 09d754db0b..82d4328764 100644 --- a/modules/beamdyn/src/BeamDyn_Types.f90 +++ b/modules/beamdyn/src/BeamDyn_Types.f90 @@ -52,6 +52,7 @@ MODULE BeamDyn_Types 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) [-] + LOGICAL :: MirrorRotor = .FALSE. !< Flag indicating the rotor rotation direction is mirrored (counter-clockwise viewed from upwind) [-] END TYPE BD_InitInputType ! ======================= ! ========= BD_InitOutputType ======= @@ -354,6 +355,7 @@ subroutine BD_CopyInitInput(SrcInitInputData, DstInitInputData, CtrlCode, ErrSta DstInitInputData%Linearize = SrcInitInputData%Linearize DstInitInputData%DynamicSolve = SrcInitInputData%DynamicSolve DstInitInputData%CompAeroMaps = SrcInitInputData%CompAeroMaps + DstInitInputData%MirrorRotor = SrcInitInputData%MirrorRotor end subroutine subroutine BD_DestroyInitInput(InitInputData, ErrStat, ErrMsg) @@ -381,6 +383,7 @@ subroutine BD_PackInitInput(RF, Indata) call RegPack(RF, InData%Linearize) call RegPack(RF, InData%DynamicSolve) call RegPack(RF, InData%CompAeroMaps) + call RegPack(RF, InData%MirrorRotor) if (RegCheckErr(RF, RoutineName)) return end subroutine @@ -400,6 +403,7 @@ subroutine BD_UnPackInitInput(RF, OutData) 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 + call RegUnpack(RF, OutData%MirrorRotor); if (RegCheckErr(RF, RoutineName)) return end subroutine subroutine BD_CopyInitOutput(SrcInitOutputData, DstInitOutputData, CtrlCode, ErrStat, ErrMsg) diff --git a/modules/beamdyn/src/Registry_BeamDyn.txt b/modules/beamdyn/src/Registry_BeamDyn.txt index b07e467e99..eeb8ab9844 100644 --- a/modules/beamdyn/src/Registry_BeamDyn.txt +++ b/modules/beamdyn/src/Registry_BeamDyn.txt @@ -33,7 +33,7 @@ typedef ^ InitInputType ReKi RootVel {6} - - "Initial 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)" - - +typedef ^ InitInputType LOGICAL MirrorRotor - .FALSE. - "Flag indicating the rotor rotation direction is mirrored (counter-clockwise viewed from upwind)" - # Define outputs that the initialization routine may need here: # e.g., the name of the input file, the file root name, etc. diff --git a/modules/beamdyn/tests/beamdyn_utest.F90 b/modules/beamdyn/tests/beamdyn_utest.F90 index ee549641a0..10860158fd 100644 --- a/modules/beamdyn/tests/beamdyn_utest.F90 +++ b/modules/beamdyn/tests/beamdyn_utest.F90 @@ -6,6 +6,7 @@ program beamdyn_utest use test_BD_diffmtc, only: test_BD_diffmtc_suite use test_BD_InitializeNodalLocations, only: test_BD_InitializeNodalLocations_suite use test_BD_MemberEta, only: test_BD_MemberEta_suite + use test_BD_MirrorBladeData, only: test_BD_MirrorBladeData_suite use test_BD_Misc, only: test_BD_Misc_suite use test_BD_QuadraturePointData, only: test_BD_QuadraturePointData_suite use test_BD_ShapeFuncs, only: test_BD_ShapeFuncs_suite @@ -26,6 +27,7 @@ program beamdyn_utest new_testsuite("diffmtc", test_BD_diffmtc_suite), & new_testsuite("InitializeNodalLocations", test_BD_InitializeNodalLocations_suite), & new_testsuite("MemberEta", test_BD_MemberEta_suite), & + new_testsuite("MirrorBladeData", test_BD_MirrorBladeData_suite), & new_testsuite("Misc", test_BD_Misc_suite), & new_testsuite("QuadraturePointData", test_BD_QuadraturePointData_suite), & new_testsuite("ShapeFuncs", test_BD_ShapeFuncs_suite), & diff --git a/modules/beamdyn/tests/test_BD_MirrorBladeData.F90 b/modules/beamdyn/tests/test_BD_MirrorBladeData.F90 new file mode 100644 index 0000000000..9f0ba744bb --- /dev/null +++ b/modules/beamdyn/tests/test_BD_MirrorBladeData.F90 @@ -0,0 +1,142 @@ +module test_BD_MirrorBladeData + +! Tests the blade mirror transform used for counter-clockwise rotors. +! +! The transform is a similarity transform T*M*T^T with T = diag(1,-1,1,-1,1,-1), +! reflecting the sectional degrees of freedom about the local x-z plane. + +use BeamDyn +use BeamDyn_IO +use NWTC_Num +use test_tools + +implicit none + +private +public :: test_BD_MirrorBladeData_suite + +real(BDKi), parameter :: tol = 1.0e-14_BDKi + +contains + +!> Collect all exported unit tests +subroutine test_BD_MirrorBladeData_suite(testsuite) + type(unittest_type), allocatable, intent(out) :: testsuite(:) + testsuite = [ & + new_unittest("test_BD_Mirror_involution", test_BD_Mirror_involution), & + new_unittest("test_BD_Mirror_signs", test_BD_Mirror_signs), & + new_unittest("test_BD_Mirror_inertia_constraint", test_BD_Mirror_inertia_constraint), & + new_unittest("test_BD_Mirror_keypoints", test_BD_Mirror_keypoints) & + ] +end subroutine + +!> Build an input-file structure with one arbitrary but asymmetric station. +subroutine make_blade(InputFileData) + type(BD_InputFile), intent(out) :: InputFileData + integer(IntKi) :: i, j + + allocate (InputFileData%InpBl%stiff0(6, 6, 1)) + allocate (InputFileData%InpBl%mass0(6, 6, 1)) + allocate (InputFileData%kp_coordinate(2, 4)) + + ! Distinct, non-symmetric entries so a wrong sign cannot cancel out. + do j = 1, 6 + do i = 1, 6 + InputFileData%InpBl%stiff0(i, j, 1) = real(10*i + j, BDKi) + InputFileData%InpBl%mass0(i, j, 1) = real(100 + 10*i + j, BDKi) + end do + end do + + InputFileData%kp_coordinate(1, :) = (/0.0_BDKi, 0.0_BDKi, 0.0_BDKi, 0.0_BDKi/) + InputFileData%kp_coordinate(2, :) = (/0.25_BDKi, 1.5_BDKi, 30.0_BDKi, -0.2_BDKi/) +end subroutine + +!> T is its own inverse, so mirroring twice must return the original blade. +subroutine test_BD_Mirror_involution(error) + type(error_type), allocatable, intent(out) :: error + type(BD_InputFile) :: bld, ref + character(1024) :: testname + + testname = "mirroring twice returns the original blade:" + call make_blade(bld) + call make_blade(ref) + + call BD_MirrorBladeData(bld) + call BD_MirrorBladeData(bld) + + call check_array(error, ref%InpBl%stiff0(:, :, 1), bld%InpBl%stiff0(:, :, 1), testname, tol) + if (allocated(error)) return + call check_array(error, ref%InpBl%mass0(:, :, 1), bld%InpBl%mass0(:, :, 1), testname, tol) + if (allocated(error)) return + call check_array(error, ref%kp_coordinate, bld%kp_coordinate, testname, tol) +end subroutine + +!> Every entry flips sign exactly when one index is in {2,4,6} and the other is not. +subroutine test_BD_Mirror_signs(error) + type(error_type), allocatable, intent(out) :: error + type(BD_InputFile) :: bld, ref + real(BDKi) :: expected(6, 6) + integer(IntKi) :: i, j + logical :: flip_i, flip_j + character(1024) :: testname + + testname = "entries flip when exactly one index is in {2,4,6}:" + call make_blade(bld) + call make_blade(ref) + call BD_MirrorBladeData(bld) + + do j = 1, 6 + do i = 1, 6 + flip_i = (i == 2 .or. i == 4 .or. i == 6) + flip_j = (j == 2 .or. j == 4 .or. j == 6) + if (flip_i .neqv. flip_j) then + expected(i, j) = -ref%InpBl%stiff0(i, j, 1) + else + expected(i, j) = ref%InpBl%stiff0(i, j, 1) + end if + end do + end do + + call check_array(error, expected, bld%InpBl%stiff0(:, :, 1), testname, tol) +end subroutine + +!> The polar-inertia check in BD_ValidateInputData must survive the mirror. +subroutine test_BD_Mirror_inertia_constraint(error) + type(error_type), allocatable, intent(out) :: error + type(BD_InputFile) :: bld + real(BDKi) :: r1, r2 + character(1024) :: testname + + testname = "mass0(6,6) = mass0(4,4) + mass0(5,5) survives the mirror:" + call make_blade(bld) + ! Make the station satisfy the constraint going in. + bld%InpBl%mass0(6, 6, 1) = bld%InpBl%mass0(4, 4, 1) + bld%InpBl%mass0(5, 5, 1) + + call BD_MirrorBladeData(bld) + + r1 = bld%InpBl%mass0(6, 6, 1) + r2 = bld%InpBl%mass0(4, 4, 1) + bld%InpBl%mass0(5, 5, 1) + call check(error, r1, r2, testname, thr=tol) +end subroutine + +!> Key points reflect in y and reverse twist; the x and z offsets are untouched. +subroutine test_BD_Mirror_keypoints(error) + type(error_type), allocatable, intent(out) :: error + type(BD_InputFile) :: bld, ref + real(BDKi) :: expected(4) + character(1024) :: testname + + testname = "key points reflect in y and reverse twist:" + call make_blade(bld) + call make_blade(ref) + call BD_MirrorBladeData(bld) + + expected(1) = ref%kp_coordinate(2, 1) + expected(2) = -ref%kp_coordinate(2, 2) + expected(3) = ref%kp_coordinate(2, 3) + expected(4) = -ref%kp_coordinate(2, 4) + + call check_array(error, expected, bld%kp_coordinate(2, :), testname, tol) +end subroutine + +end module diff --git a/modules/openfast-library/src/FAST_Subs.f90 b/modules/openfast-library/src/FAST_Subs.f90 index 7eac8123aa..dc426c59d7 100644 --- a/modules/openfast-library/src/FAST_Subs.f90 +++ b/modules/openfast-library/src/FAST_Subs.f90 @@ -444,6 +444,7 @@ SUBROUTINE FAST_InitializeAll( t_initial, m_Glue, p_FAST, y_FAST, m_FAST, ED, SE 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%MirrorRotor = p_FAST%MirrorRotor(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" @@ -2215,7 +2216,6 @@ SUBROUTINE ValidateInputData(p, m_FAST, ErrStat, ErrMsg) if (p%Linearize) CALL SetErrStat( ErrID_Fatal, 'MirrorRotor is not yet supported with linearization.', ErrStat, ErrMsg, RoutineName ) if (p%CompAeroMaps) CALL SetErrStat( ErrID_Fatal, 'MirrorRotor is not yet supported with the steady-state (aero map) solver.', ErrStat, ErrMsg, RoutineName ) if (p%CompElast == Module_SED) CALL SetErrStat( ErrID_Fatal, 'MirrorRotor is not yet supported with SimplifiedElastoDyn.', ErrStat, ErrMsg, RoutineName ) - if (p%CompElast == Module_BD) CALL SetErrStat( ErrID_Fatal, 'MirrorRotor is not yet supported with BeamDyn.', ErrStat, ErrMsg, RoutineName ) if (p%CompAero == Module_ADsk) CALL SetErrStat( ErrID_Fatal, 'MirrorRotor is not yet supported with AeroDisk.', ErrStat, ErrMsg, RoutineName ) if (p%CompAero == Module_ExtLd) CALL SetErrStat( ErrID_Fatal, 'MirrorRotor is not yet supported with ExtLoads.', ErrStat, ErrMsg, RoutineName ) if (p%CompServo == Module_SrvD) CALL SetErrStat( ErrID_Fatal, 'MirrorRotor is not yet supported with ServoDyn.', ErrStat, ErrMsg, RoutineName ) diff --git a/unit_tests/CMakeLists.txt b/unit_tests/CMakeLists.txt index c85dae1018..232144e037 100644 --- a/unit_tests/CMakeLists.txt +++ b/unit_tests/CMakeLists.txt @@ -38,6 +38,7 @@ add_executable(beamdyn_utest ${PROJECT_SOURCE_DIR}/modules/beamdyn/tests/test_BD_Misc.F90 ${PROJECT_SOURCE_DIR}/modules/beamdyn/tests/test_BD_diffmtc.F90 ${PROJECT_SOURCE_DIR}/modules/beamdyn/tests/test_BD_MemberEta.F90 + ${PROJECT_SOURCE_DIR}/modules/beamdyn/tests/test_BD_MirrorBladeData.F90 ${PROJECT_SOURCE_DIR}/modules/beamdyn/tests/test_BD_QuadraturePointData.F90 ${PROJECT_SOURCE_DIR}/modules/beamdyn/tests/test_BD_ShapeFuncs.F90 ${PROJECT_SOURCE_DIR}/modules/beamdyn/tests/test_BD_TrapezoidalPointWeight.F90 From 77b723496c6aed5258dc321f17eb958c751def40 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Wed, 19 Aug 2026 01:47:18 -0600 Subject: [PATCH 13/66] Register the BeamDyn mirrored-rotor regression pair Adds 5MW_Land_BD_noDLL_Steady_CW and 5MW_Land_BD_noDLL_Steady_MirrorRotor under the mirrorrotor label alongside the ElastoDyn pair. Co-authored-by: GitHub Copilot Co-authored-by: Claude Opus 5 --- reg_tests/CTestList.cmake | 2 ++ reg_tests/r-test | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/reg_tests/CTestList.cmake b/reg_tests/CTestList.cmake index ddcefb9c1c..97c7267f92 100644 --- a/reg_tests/CTestList.cmake +++ b/reg_tests/CTestList.cmake @@ -351,6 +351,8 @@ of_regression("SWRT_YFree_VS_WTurb" "openfast;elastodyn;aerod of_regression("5MW_Land_DLL_WTurb" "openfast;elastodyn;aerodyn;servodyn") of_regression("5MW_Land_noDLL_Steady_CW" "openfast;elastodyn;aerodyn;mirrorrotor") of_regression("5MW_Land_noDLL_Steady_MirrorRotor" "openfast;elastodyn;aerodyn;mirrorrotor") +of_regression("5MW_Land_BD_noDLL_Steady_CW" "openfast;elastodyn;beamdyn;aerodyn;mirrorrotor") +of_regression("5MW_Land_BD_noDLL_Steady_MirrorRotor" "openfast;elastodyn;beamdyn;aerodyn;mirrorrotor") 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") diff --git a/reg_tests/r-test b/reg_tests/r-test index 6323a42f82..7a90d9c9e0 160000 --- a/reg_tests/r-test +++ b/reg_tests/r-test @@ -1 +1 @@ -Subproject commit 6323a42f8264ef39044389c3fd2e6835f62ba35d +Subproject commit 7a90d9c9e084217d317c79e0721970ff4d4d19bc From 2f5a4614c96b66dbaf0c79cf2e3080e3b1336617 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Wed, 19 Aug 2026 01:52:14 -0600 Subject: [PATCH 14/66] Update r-test: drop generated BeamDyn summary files Co-authored-by: GitHub Copilot Co-authored-by: Claude Opus 5 --- 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 7a90d9c9e0..de08772ce3 160000 --- a/reg_tests/r-test +++ b/reg_tests/r-test @@ -1 +1 @@ -Subproject commit 7a90d9c9e084217d317c79e0721970ff4d4d19bc +Subproject commit de08772ce35267dc4535f6b66c63a7defb6b7227 From a4b78d21bc26d7daf2b8ad2c5ad4dfa6a07ef7e8 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Wed, 19 Aug 2026 07:22:43 -0600 Subject: [PATCH 15/66] Report the ElastoDyn pitch and brake outputs in the rotor's convention y%BlPitch was inconsistent: it carried the physical pitch angle when the pitch DOF was enabled, but the command it was handed when it was not. Apply RotDir to the DOF branch so the output is always in the command's convention, which is what ServoDyn is given. HSSBrTq belongs to the same generator-side family as HSShftTq and HSShftPwr, so it reads in the rotor's own convention rather than about the +x shaft axis. Co-authored-by: GitHub Copilot Co-authored-by: Claude Opus 5 --- modules/elastodyn/src/ElastoDyn.f90 | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/modules/elastodyn/src/ElastoDyn.f90 b/modules/elastodyn/src/ElastoDyn.f90 index 0f0ebb9ef3..e590060860 100644 --- a/modules/elastodyn/src/ElastoDyn.f90 +++ b/modules/elastodyn/src/ElastoDyn.f90 @@ -1283,7 +1283,7 @@ SUBROUTINE ED_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) ! high-speed shaft torque and power are reported in the rotor's own convention. m%AllOuts( HSShftTq) = p%RotDir*m%AllOuts(LSShftMxa)*m%RtHS%GBoxEffFac/ABS(p%GBRatio) m%AllOuts(HSShftPwr) = m%AllOuts( HSShftTq)*ABS(p%GBRatio)*p%RotDir*x%QDT(DOF_GeAz) - m%AllOuts(HSSBrTq) = OtherState%HSSBrTrq*0.001_ReKi + m%AllOuts(HSSBrTq) = p%RotDir*OtherState%HSSBrTrq*0.001_ReKi !IF ( .NOT. EqualRealNos( ComDenom, 0.0_ReKi ) ) THEN ! .TRUE. if the denominator in the following equations is not zero (ComDenom is the same as it is calculated above). @@ -1884,8 +1884,9 @@ SUBROUTINE ED_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) 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) ) + ! MirrorRotor: reported in the pitch command's convention, as in the branch below. + y%BlPRate(K) = p%RotDir * x%QDT( DOF_BP(K) ) + y%BlPitch(K) = p%RotDir * x%QT( DOF_BP(K) ) ELSE y%BlPRate(K) = 0.0_ReKi y%BlPitch(K) = u%BlPitchCom(K) From fac18eec1e3e9f43c2ae391688f7cbc87c1bee32 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Wed, 19 Aug 2026 07:22:55 -0600 Subject: [PATCH 16/66] Refuse to mirror a furling turbine A furling machine is chiral by design: the tail boom, tail fin and the rotor- and tail-furl axes are all offset to one side, and the nacelle mass centre is laterally offset with them. Reversing only the rotor leaves that geometry untouched and produces a turbine that is not the mirror of anything. Mirroring it properly means transforming the furl input file as well, which is out of scope, so fail rather than answer quietly. Co-authored-by: GitHub Copilot Co-authored-by: Claude Opus 5 --- modules/elastodyn/src/ElastoDyn.f90 | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/modules/elastodyn/src/ElastoDyn.f90 b/modules/elastodyn/src/ElastoDyn.f90 index e590060860..db3c452c93 100644 --- a/modules/elastodyn/src/ElastoDyn.f90 +++ b/modules/elastodyn/src/ElastoDyn.f90 @@ -3409,7 +3409,16 @@ SUBROUTINE SetPrimaryParameters( InitInp, p, InputFileData, ErrStat, ErrMsg ) p%GBoxEff = InputFileData%GBoxEff p%GBRatio = InputFileData%GBRatio p%RotDir = 1.0_ReKi - if (InitInp%MirrorRotor) p%RotDir = -1.0_ReKi + if (InitInp%MirrorRotor) then + p%RotDir = -1.0_ReKi + ! A furling machine is deliberately one-sided: tail boom, tail fin and furl axes are + ! all offset to one side, and that geometry is not mirrored here. + if (InputFileData%Furling) then + CALL SetErrStat( ErrID_Fatal, 'MirrorRotor is not supported for a furling turbine. '// & + 'The furl geometry would have to be mirrored as well.', ErrStat, ErrMsg, 'SetPrimaryParameters' ) + RETURN + end if + end if p%DTTorSpr = InputFileData%DTTorSpr p%DTTorDmp = InputFileData%DTTorDmp From e477a171eced9fbcf715b500027c0d755f3d4a7d Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Wed, 19 Aug 2026 07:23:04 -0600 Subject: [PATCH 17/66] Present the ServoDyn interface in the clockwise convention ServoDyn is left entirely alone. Instead the signals crossing its boundary are converted, so an unmodified controller -- including a Bladed-style DLL such as ROSCO -- sees exactly what it would see on a clockwise rotor and needs no knowledge that the rotor has been reversed. In-plane and about-axis quantities flip; out-of-plane ones do not. HSS_Spd and BlPitch already arrive in that convention from ElastoDyn, RotPwr is a product of two flipped quantities, and ElastoDyn signs the generator and brake torques itself, so none of those are converted here. The shaft azimuth is negated and re-wrapped so it still increases clockwise. Yaw is deliberately untouched. It acts about the vertical axis in the inertial frame, so it is not a rotor-convention quantity: the yaw error stays physically correct and a yaw controller still points the nacelle into the real wind. ServoDyn also receives the yaw angle and rate through the ordinary variable mapping rather than here, so converting the yaw moment on its own would inverse the sign of its yaw spring and drive the nacelle unstable. Co-authored-by: GitHub Copilot Co-authored-by: Claude Opus 5 --- modules/openfast-library/src/FAST_Mapping.f90 | 61 ++++++++++++++----- modules/openfast-library/src/FAST_Subs.f90 | 1 - 2 files changed, 47 insertions(+), 15 deletions(-) diff --git a/modules/openfast-library/src/FAST_Mapping.f90 b/modules/openfast-library/src/FAST_Mapping.f90 index 0f4444c139..8931cb40fd 100644 --- a/modules/openfast-library/src/FAST_Mapping.f90 +++ b/modules/openfast-library/src/FAST_Mapping.f90 @@ -3312,6 +3312,7 @@ subroutine Custom_InputSolve(Mapping, ModSrc, ModDst, iInput, T, ErrStat, ErrMsg real(R8Ki) :: r(3), r_hub(3) real(R8Ki) :: Vrot(3), Vel(3) real(R8Ki) :: DampingForce(3) + real(ReKi) :: RotDir !< +1 normal, -1 for a mirrored rotor ErrStat = ErrID_None ErrMsg = '' @@ -3387,10 +3388,21 @@ subroutine Custom_InputSolve(Mapping, ModSrc, ModDst, iInput, T, ErrStat, ErrMsg case (Custom_SrvD_to_ED) + ! MirrorRotor: ServoDyn works entirely in the clockwise convention, so signals + ! crossing this boundary are converted rather than ServoDyn being told anything. + ! GenTrq and HSSBrTrqC are not converted: ElastoDyn applies RotDir to the generator + ! torque itself, and the brake torque is signed there by the rotation direction. + ! Yaw is not converted either: it acts about the vertical axis in the inertial + ! frame, so it is not a rotor-convention quantity. ServoDyn is given the physical + ! yaw angle and rate through the ordinary variable mapping, which already makes + ! its yaw spring and damper mirror correctly. + RotDir = 1.0_ReKi + if (T%p_FAST%MirrorRotor(ModDst%iRotor)) RotDir = -1.0_ReKi + 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)%BlPitchMom = RotDir*T%SrvD%y(ModSrc%Ins)%BlPitchMom T%ED%Input(iInput, ModDst%Ins)%YawMom = T%SrvD%y(ModSrc%Ins)%YawMom case (Custom_ED_Tower_Damping) @@ -3546,9 +3558,14 @@ subroutine Custom_InputSolve(Mapping, ModSrc, ModDst, iInput, T, ErrStat, ErrMsg iBld = T%p_FAST%BDBldMap(ModSrc%Ins) - T%SrvD%Input(iInput,ModDst%Ins)%RootMxc(iBld) = & + ! MirrorRotor: in-plane root moment is presented in the clockwise convention, as in + ! the ElastoDyn path below. + RotDir = 1.0_ReKi + if (T%p_FAST%MirrorRotor(ModDst%iRotor)) RotDir = -1.0_ReKi + + T%SrvD%Input(iInput,ModDst%Ins)%RootMxc(iBld) = RotDir*( & 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%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)) + & @@ -3556,39 +3573,55 @@ subroutine Custom_InputSolve(Mapping, ModSrc, ModDst, iInput, T, ErrStat, ErrMsg case (Custom_ED_to_SrvD) + ! MirrorRotor: everything ServoDyn sees is presented in the clockwise convention, so + ! an unmodified controller behaves exactly as it does on a clockwise rotor. + ! In-plane and about-axis quantities flip; out-of-plane ones do not. HSS_Spd and + ! BlPitch already arrive in that convention from ElastoDyn, and RotPwr is a product + ! of two flipped quantities, so none of those are converted here. + RotDir = 1.0_ReKi + if (T%p_FAST%MirrorRotor(ModSrc%iRotor)) RotDir = -1.0_ReKi + ! 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)%RootMxc = RotDir*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 + ! Yaw is left alone: it is an inertial-frame quantity, so the yaw error stays + ! physically correct and an unmodified yaw controller still points the nacelle + ! into the real wind. 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)%LSS_Spd = RotDir*T%ED%y(ModSrc%Ins)%LSS_Spd + T%SrvD%Input(iInput,ModDst%Ins)%RotSpeed = RotDir*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)%YawBrTAyp = RotDir*T%ED%y(ModSrc%Ins)%YawBrTAyp T%SrvD%Input(iInput,ModDst%Ins)%LSSTipPxa = T%ED%y(ModSrc%Ins)%LSSTipPxa + if (T%p_FAST%MirrorRotor(ModSrc%iRotor)) then + ! Present a clockwise-increasing azimuth, re-wrapped into [0, 2pi). + T%SrvD%Input(iInput,ModDst%Ins)%LSSTipPxa = -T%SrvD%Input(iInput,ModDst%Ins)%LSSTipPxa + call Zero2TwoPi(T%SrvD%Input(iInput,ModDst%Ins)%LSSTipPxa) + end if - T%SrvD%Input(iInput,ModDst%Ins)%LSSTipMxa = T%ED%y(ModSrc%Ins)%LSSTipMxa + T%SrvD%Input(iInput,ModDst%Ins)%LSSTipMxa = RotDir*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)%LSSTipMza = RotDir*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)%LSSTipMzs = RotDir*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)%YawBrMzn = RotDir*T%ED%y(ModSrc%Ins)%YawBrMzn + T%SrvD%Input(iInput,ModDst%Ins)%NcIMURAxs = RotDir*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)%NcIMURAzs = RotDir*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)%LSShftFys = RotDir*T%ED%y(ModSrc%Ins)%LSShftFys T%SrvD%Input(iInput,ModDst%Ins)%LSShftFzs = T%ED%y(ModSrc%Ins)%LSShftFzs case (Custom_SED_to_SrvD) diff --git a/modules/openfast-library/src/FAST_Subs.f90 b/modules/openfast-library/src/FAST_Subs.f90 index dc426c59d7..6363077105 100644 --- a/modules/openfast-library/src/FAST_Subs.f90 +++ b/modules/openfast-library/src/FAST_Subs.f90 @@ -2218,7 +2218,6 @@ SUBROUTINE ValidateInputData(p, m_FAST, ErrStat, ErrMsg) if (p%CompElast == Module_SED) CALL SetErrStat( ErrID_Fatal, 'MirrorRotor is not yet supported with SimplifiedElastoDyn.', ErrStat, ErrMsg, RoutineName ) if (p%CompAero == Module_ADsk) CALL SetErrStat( ErrID_Fatal, 'MirrorRotor is not yet supported with AeroDisk.', ErrStat, ErrMsg, RoutineName ) if (p%CompAero == Module_ExtLd) CALL SetErrStat( ErrID_Fatal, 'MirrorRotor is not yet supported with ExtLoads.', ErrStat, ErrMsg, RoutineName ) - if (p%CompServo == Module_SrvD) CALL SetErrStat( ErrID_Fatal, 'MirrorRotor is not yet supported with ServoDyn.', ErrStat, ErrMsg, RoutineName ) end if end if From d9dda4610a0625b3dd9b8cd7d8a8a170403c8921 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Wed, 19 Aug 2026 07:29:12 -0600 Subject: [PATCH 18/66] Register the mirrored high-speed-shutdown case Adds AWT_WSt_StartUp_HighSpShutDown_MirrorRotor under the mirrorrotor label. This is the first mirrored regression case with ServoDyn in the loop, and it covers the high-speed-shaft brake through zero rotor speed. Co-authored-by: GitHub Copilot Co-authored-by: Claude Opus 5 --- reg_tests/CTestList.cmake | 1 + reg_tests/r-test | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/reg_tests/CTestList.cmake b/reg_tests/CTestList.cmake index 97c7267f92..7fb309a469 100644 --- a/reg_tests/CTestList.cmake +++ b/reg_tests/CTestList.cmake @@ -332,6 +332,7 @@ endfunction(py_wavetank_regression) # OpenFAST regression tests of_regression("AWT_YFix_WSt" "openfast;elastodyn;aerodyn;servodyn") of_regression("AWT_WSt_StartUp_HighSpShutDown" "openfast;elastodyn;aerodyn;servodyn") +of_regression("AWT_WSt_StartUp_HighSpShutDown_MirrorRotor" "openfast;elastodyn;aerodyn;servodyn;mirrorrotor") of_regression("AWT_YFree_WSt" "openfast;elastodyn;aerodyn;servodyn") of_regression("AWT_YFree_WTurb" "openfast;elastodyn;aerodyn;servodyn") of_regression("AWT_WSt_StartUpShutDown" "openfast;elastodyn;aerodyn;servodyn") diff --git a/reg_tests/r-test b/reg_tests/r-test index de08772ce3..658b05aaa5 160000 --- a/reg_tests/r-test +++ b/reg_tests/r-test @@ -1 +1 @@ -Subproject commit de08772ce35267dc4535f6b66c63a7defb6b7227 +Subproject commit 658b05aaa5f2b058fb92c8c9420468bf8565404e From ca0581bf1d00baeec7bd9df7c026be0f7367103c Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Wed, 19 Aug 2026 07:49:16 -0600 Subject: [PATCH 19/66] Document controllers and the inputs the mirror does not touch Adds two sections. The first records that ServoDyn is left unmodified and is handed everything in the clockwise convention, and why yaw is deliberately excluded from that. The second is the one that costs time if it is not written down: mirroring the turbine does not mirror the environment or the control setpoints. Initial nacelle yaw, wind direction, horizontal shear, a turbulence box, a prescribed structural-control load and lateral geometry are all left as written, and leaving one of them unmirrored looks exactly like a sign error in the code. Also corrects the limitations table, which still listed BeamDyn and ServoDyn as unsupported, and adds the furling restriction. Co-authored-by: GitHub Copilot Co-authored-by: Claude Opus 5 --- docs/source/user/glue-code/mirror_rotor.rst | 52 ++++++++++++++++++--- 1 file changed, 45 insertions(+), 7 deletions(-) diff --git a/docs/source/user/glue-code/mirror_rotor.rst b/docs/source/user/glue-code/mirror_rotor.rst index b021dcc545..e7bbfbc198 100644 --- a/docs/source/user/glue-code/mirror_rotor.rst +++ b/docs/source/user/glue-code/mirror_rotor.rst @@ -147,6 +147,46 @@ clockwise one. * - Mirrored angle - ``LSSTipPxa``, ``LSSGagPxa`` +.. _glue-code-mirror-rotor-control: + +Controllers +----------- + +ServoDyn is not told that the rotor has been reversed. Everything crossing its +boundary is presented in the **clockwise convention**, so an unmodified +controller — including a Bladed-style DLL such as ROSCO — sees exactly what it +would see on a clockwise machine and behaves identically. Rotor speed, blade +pitch, generator and brake torque, shaft azimuth and the blade root moments are +all converted; the controller needs no mirrored copy and no new input. + +Yaw is the exception, and it is deliberate. Yaw acts about the vertical axis in +the inertial frame, so it is **not** a rotor-convention quantity and is left +alone. The yaw angle, the wind direction and hence the yaw error all stay +physically correct, which means a yaw controller still points the nacelle into +the real wind rather than into its mirror image. + +.. _glue-code-mirror-rotor-asymmetric: + +Inputs that are not mirrored +---------------------------- + +The flag mirrors the **turbine**. It does not mirror the environment, the +control setpoints, or any other input that happens to be one-sided. Anything in +the list below is left exactly as written, and must be mirrored by hand if the +intent is to reproduce the mirror image of a clockwise simulation: + +- initial or fixed nacelle yaw (``NacYaw``) and the neutral yaw position + (``YawNeut``); +- wind direction and horizontal shear in a uniform wind file — vertical shear is + symmetric about the mirror plane and needs no change; +- a full-field turbulence box, which has to be reflected in :math:`y`; +- prescribed force and moment time series for a structural control, where the + lateral force and the roll and yaw moments change sign; +- lateral geometry such as ``NacCMyn``. + +This matters most when verifying the mirror: leaving one of these unmirrored +looks exactly like a sign error in the code. + .. _glue-code-mirror-rotor-limits: Limitations @@ -166,22 +206,20 @@ through. - ``Linearize = T`` * - Steady-state solver - ``CompAeroMaps = T`` - * - BeamDyn - - ``CompElast = 2`` * - SimplifiedElastoDyn - ``CompElast = 3`` * - AeroDisk, ExtLoads - ``CompAero = 1`` or ``3`` - * - ServoDyn - - ``CompServo = 1`` + * - Furling turbines + - ``Furling = True`` in the ElastoDyn input file. A furling machine is + chiral by design — the tail boom, tail fin and furl axes are all offset + to one side — so reversing only the rotor would leave that geometry + inconsistent with it. * - OLAF free vortex wake - ``Wake_Mod = 3`` in the AeroDyn input file * - AeroAcoustics - ``CompAA = True`` in the AeroDyn input file -Because ServoDyn is not yet supported, a mirrored rotor currently runs without a -controller, at fixed or freely accelerating rotor speed. - .. _glue-code-mirror-rotor-verification: Verification From b6c9f5451a79e3cf93d68e1b653d9eaecfc141b4 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Wed, 19 Aug 2026 07:59:33 -0600 Subject: [PATCH 20/66] Register the mirrored turbulent controller cases Adds 5MW_Land_DLL_WTurb_MirrorRotor and 5MW_Land_BD_DLL_WTurb_MirrorRotor under the mirrorrotor label. These are the cases that drive a mirrored rotor with an unmodified Bladed-style controller through a y-reflected turbulence box, and they complete the mirrored-rotor coverage for ServoDyn. Co-authored-by: GitHub Copilot Co-authored-by: Claude Opus 5 --- reg_tests/CTestList.cmake | 2 ++ reg_tests/r-test | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/reg_tests/CTestList.cmake b/reg_tests/CTestList.cmake index 7fb309a469..b8141041c9 100644 --- a/reg_tests/CTestList.cmake +++ b/reg_tests/CTestList.cmake @@ -350,6 +350,7 @@ of_regression("SWRT_YFree_VS_EDG01" "openfast;elastodyn;aerod of_regression("SWRT_YFree_VS_EDC01" "openfast;elastodyn;aerodyn;servodyn") 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_MirrorRotor" "openfast;elastodyn;aerodyn;servodyn;mirrorrotor") of_regression("5MW_Land_noDLL_Steady_CW" "openfast;elastodyn;aerodyn;mirrorrotor") of_regression("5MW_Land_noDLL_Steady_MirrorRotor" "openfast;elastodyn;aerodyn;mirrorrotor") of_regression("5MW_Land_BD_noDLL_Steady_CW" "openfast;elastodyn;beamdyn;aerodyn;mirrorrotor") @@ -368,6 +369,7 @@ of_regression("5MW_OC3Spar_DLL_WTurb_WavesIrr" "openfast;elastodyn;aerod 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_MirrorRotor" "openfast;beamdyn;aerodyn;servodyn;mirrorrotor") 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;offshore") diff --git a/reg_tests/r-test b/reg_tests/r-test index 658b05aaa5..8f3cbc55f8 160000 --- a/reg_tests/r-test +++ b/reg_tests/r-test @@ -1 +1 @@ -Subproject commit 658b05aaa5f2b058fb92c8c9420468bf8565404e +Subproject commit 8f3cbc55f82dc75d91667b39ac042430fd1abe20 From abd985b20ebb4cca7783d76d11ef0ce73ce1782c Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Wed, 19 Aug 2026 08:09:38 -0600 Subject: [PATCH 21/66] Allow a mirrored furling turbine, with a warning Downgrades the furling guard from fatal to a warning and lets the run proceed. The tail is modelled as a drag force applying a moment about the yaw axis, and that calculation does not depend on which way the rotor turns, since the tail does not interact with the wake. With the aerodynamic and structural mirror already verified, there is reasonable confidence the combination behaves as intended once the whole structure is mirrored. What the flag does not do is mirror the furl geometry itself. That puts furling in the same category as an initial nacelle yaw or a wind direction: an asymmetric input the user must mirror as well if the intent is to reproduce the mirror image of the clockwise turbine. The documentation moves it accordingly, out of the unsupported table and into the list of inputs the mirror leaves alone. Co-authored-by: GitHub Copilot Co-authored-by: Claude Opus 5 --- docs/source/user/glue-code/mirror_rotor.rst | 15 +++++++++------ modules/elastodyn/src/ElastoDyn.f90 | 10 +++++----- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/docs/source/user/glue-code/mirror_rotor.rst b/docs/source/user/glue-code/mirror_rotor.rst index e7bbfbc198..1f303e7d6d 100644 --- a/docs/source/user/glue-code/mirror_rotor.rst +++ b/docs/source/user/glue-code/mirror_rotor.rst @@ -182,7 +182,15 @@ intent is to reproduce the mirror image of a clockwise simulation: - a full-field turbulence box, which has to be reflected in :math:`y`; - prescribed force and moment time series for a structural control, where the lateral force and the roll and yaw moments change sign; -- lateral geometry such as ``NacCMyn``. +- lateral geometry such as ``NacCMyn``; +- the furl geometry of a furling turbine — the tail boom, tail fin and the + rotor- and tail-furl axes are all offset to one side. Setting + ``MirrorRotor`` with ``Furling = True`` raises a warning and continues: the + tail is modelled as a drag force applying a moment about the yaw axis, and + that calculation does not depend on which way the rotor turns, since tail + interaction with the wake is not modelled. The combination has not been + verified against a mirror pair, however, because doing so requires mirroring + the furl input file as well. This matters most when verifying the mirror: leaving one of these unmirrored looks exactly like a sign error in the code. @@ -210,11 +218,6 @@ through. - ``CompElast = 3`` * - AeroDisk, ExtLoads - ``CompAero = 1`` or ``3`` - * - Furling turbines - - ``Furling = True`` in the ElastoDyn input file. A furling machine is - chiral by design — the tail boom, tail fin and furl axes are all offset - to one side — so reversing only the rotor would leave that geometry - inconsistent with it. * - OLAF free vortex wake - ``Wake_Mod = 3`` in the AeroDyn input file * - AeroAcoustics diff --git a/modules/elastodyn/src/ElastoDyn.f90 b/modules/elastodyn/src/ElastoDyn.f90 index db3c452c93..5f8ce05a66 100644 --- a/modules/elastodyn/src/ElastoDyn.f90 +++ b/modules/elastodyn/src/ElastoDyn.f90 @@ -3411,12 +3411,12 @@ SUBROUTINE SetPrimaryParameters( InitInp, p, InputFileData, ErrStat, ErrMsg ) p%RotDir = 1.0_ReKi if (InitInp%MirrorRotor) then p%RotDir = -1.0_ReKi - ! A furling machine is deliberately one-sided: tail boom, tail fin and furl axes are - ! all offset to one side, and that geometry is not mirrored here. + ! A furling machine is deliberately one-sided, and that geometry is not mirrored. if (InputFileData%Furling) then - CALL SetErrStat( ErrID_Fatal, 'MirrorRotor is not supported for a furling turbine. '// & - 'The furl geometry would have to be mirrored as well.', ErrStat, ErrMsg, 'SetPrimaryParameters' ) - RETURN + CALL SetErrStat( ErrID_Warn, 'MirrorRotor has not been fully tested for a furling turbine. '// & + 'The rotor is mirrored but the furl geometry is not, so the tail and furl inputs must be '// & + 'mirrored as well for the result to be the mirror image of the clockwise turbine.', & + ErrStat, ErrMsg, 'SetPrimaryParameters' ) end if end if p%DTTorSpr = InputFileData%DTTorSpr From 24714f5c1c8e1538ea30ced9fb2123e0dfe8afc2 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Wed, 19 Aug 2026 08:34:57 -0600 Subject: [PATCH 22/66] docs: allow 1200px width rtd render instead of default 800px --- docs/_static/custom.css | 4 ++++ docs/conf.py | 23 +++++++++++++++++++++++ 2 files changed, 27 insertions(+) create mode 100644 docs/_static/custom.css diff --git a/docs/_static/custom.css b/docs/_static/custom.css new file mode 100644 index 0000000000..6ab41b74ab --- /dev/null +++ b/docs/_static/custom.css @@ -0,0 +1,4 @@ +.wy-nav-content { + max-width: 1200px !important; /* the default was 800. allowing full width is too much on super wide screens */ +} + diff --git a/docs/conf.py b/docs/conf.py index e3ece79960..dc288c8302 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -283,6 +283,29 @@ def setup(app): objname="CMake configuration value", indextemplate="pair: %s; CMake configuration" ) + + +def setup(app): + # Register your new custom width override file + app.add_css_file('custom.css') + + try: + app.add_css_file('css/math_eq.css') + except: + pass + app.add_object_type( + "confval", + "confval", + objname="input file parameter", + indextemplate="pair: %s; input file parameter" + ) + app.add_object_type( + "cmakeval", + "cmakeval", + objname="CMake configuration value", + indextemplate="pair: %s; CMake configuration" + ) + # --- Prolog that will be included at the top of every rst file # Here: defining the role :red: for html and latex rst_prolog = r""" From e93211134fb40a79b11d6ecf6a006dded402732f Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Wed, 19 Aug 2026 08:39:10 -0600 Subject: [PATCH 23/66] Document BeamDyn, the module map, and the driver input Three gaps found while auditing what phases 1 to 3 actually left behind. BeamDyn was never documented. It gained support two phases ago and the only change made here at the time was to delete the row saying it was unsupported, which left the page implying it did not work. Worse, the concept section stated the reflection is applied at module boundaries only, and BeamDyn is precisely where that is untrue: its blade description is transformed on read, because the 6x6 stiffness and mass matrices carry couplings with a handedness of their own. That claim is now qualified and the transform is written out. Adds a module map giving, for each module, whether it changes at all and where. ServoDyn, InflowWind and the aerodynamic and structural kernels are listed with the others precisely because the answer for them is "nothing". The AeroDyn driver gained a required MirrorRotor input per turbine, which the driver documentation never mentioned and its example input blocks did not show, so a reader copying one would have written a file the driver rejects. Also brings the verification section up to date: it described only the first phase, and now names the regression pairs and the controller result. Co-authored-by: GitHub Copilot Co-authored-by: Claude Opus 5 --- docs/source/user/aerodyn/driver.rst | 12 ++ docs/source/user/glue-code/mirror_rotor.rst | 158 ++++++++++++++++++-- 2 files changed, 160 insertions(+), 10 deletions(-) diff --git a/docs/source/user/aerodyn/driver.rst b/docs/source/user/aerodyn/driver.rst index 23577f3a34..4a5c766fc4 100644 --- a/docs/source/user/aerodyn/driver.rst +++ b/docs/source/user/aerodyn/driver.rst @@ -161,6 +161,15 @@ Yawing occurs around the :math:`z_n` axis, the rotor rotates about the :math:`x **Turbine geometry definition** +Each turbine block begins with `BasicHAWTFormat`, selecting between the two +geometry formats described below, followed by `MirrorRotor`. `MirrorRotor` is +read for both formats. Setting it to `True` runs the turbine as its mirror +image, so the rotor turns counter-clockwise viewed from upwind, without changing +any of the geometry, blade or airfoil inputs that describe it. The driver +mirrors the prescribed hub motion and blade pitch to match. See +:numref:`glue-code-mirror-rotor` for what the flag does and what it does not +mirror. + Two turbine input formats are supported: - basic (`BasicHAWTFormat=True`): Basic horizontal axis wind turbine (HAWT) format. @@ -179,6 +188,7 @@ Two turbine input formats are supported: ----- 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} + False MirrorRotor(1) - Flag indicating the rotor rotation direction is mirrored (counter-clockwise viewed from upwind) 0,0,0 BaseOriginInit(1) - Coordinates of turbine base in global coordinates (m) 3 NumBlades(1) - Number of blades (-) 3. HubRad(1) - Hub radius (m) @@ -216,6 +226,7 @@ Two turbine input formats are supported: ----- Turbine(1) Geometry ------------------------------------------------------- False 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} + False MirrorRotor(1) - Flag indicating the rotor rotation direction is mirrored (counter-clockwise viewed from upwind) 0,0,0 BaseOriginInit(1) - x,y,z coordinates of turbine base origin (m) 0,0,0 BaseOrientationInit(1) - successive rotations (theta_x, theta_y, theta_z) defining initial orientation of the base frame from the global frame (e.g. roll, tilt, yaw) (deg) True HasTower(1) - True if turbine has a tower (flag) @@ -493,6 +504,7 @@ An example of an AeroDyn driver for a basic inflow, basic HAWT, and combined cas 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} + False MirrorRotor(1) - Flag indicating the rotor rotation direction is mirrored (counter-clockwise viewed from upwind) 0,0,0 BaseOriginInit(1) - Coordinate of tower base in base coordinates (m) 3 NumBlades(1) - Number of blades (-) 3. HubRad(1) - Hub radius (m) diff --git a/docs/source/user/glue-code/mirror_rotor.rst b/docs/source/user/glue-code/mirror_rotor.rst index 1f303e7d6d..a2c10a43cd 100644 --- a/docs/source/user/glue-code/mirror_rotor.rst +++ b/docs/source/user/glue-code/mirror_rotor.rst @@ -51,7 +51,8 @@ Mirroring is the reflection :math:`S = \mathrm{diag}(1, -1, 1)` about the rotor for positions, true vectors such as force and velocity, pseudovectors such as moment and angular velocity, and direction cosine matrices respectively. -The reflection is applied **at module boundaries only**. The physics kernels — +The reflection is applied **at module boundaries**, with one exception noted +below for the BeamDyn blade description. The physics kernels — the blade-element momentum solver, the unsteady aerodynamics and dynamic wake models, the airfoil interpolation, and the structural finite elements — are never told the rotor is mirrored. They continue to solve the equivalent @@ -64,6 +65,112 @@ out. Inside ElastoDyn the azimuth and rotor speed states are the **physical** ones, so a mirrored rotor really does have a negative shaft speed about the :math:`+x` axis. +.. _glue-code-mirror-rotor-where: + +Where the mirror is applied +--------------------------- + +.. list-table:: + :header-rows: 1 + :widths: 22 12 66 + + * - Module + - Changed + - Where the transformation happens + * - Glue code + - yes + - Reads ``MirrorRotor`` and distributes it to ElastoDyn, AeroDyn and + BeamDyn; holds the restrictions listed below; and carries the whole + ElastoDyn-to-ServoDyn presentation layer + * - ServoDyn + - **no** + - Nothing internal. Signals are converted in the glue code, and the + generator and brake torque signs are applied inside ElastoDyn. A + Bladed-style controller is likewise untouched + * - AeroDyn + - yes + - Four places, all at the edges — see the table below + * - BeamDyn + - yes + - The blade **input data**, not the boundary. See + :ref:`glue-code-mirror-rotor-beamdyn` + * - ElastoDyn + - yes + - Initial states, blade-pitch geometry, the gearbox, and the outputs + * - SimplifiedElastoDyn + - yes + - The same pattern as ElastoDyn + * - InflowWind + - **no** + - The flag mirrors the turbine, not the environment; a reflected + turbulence box is supplied by the user + * - BEMT, UnsteadyAero, DBEMT, AirfoilInfo + - **no** + - The physics kernels solve the equivalent clockwise problem + * - AeroDyn driver + - yes + - Per-turbine flag; mirrors the prescribed hub kinematics and pitch + * - SimplifiedElastoDyn driver + - yes + - Flag pass-through only + +Within AeroDyn: + +.. list-table:: + :header-rows: 1 + :widths: 34 46 20 + + * - What + - Where + - Direction + * - Blade twist and sweep + - On read, after the cant angle is derived from the twist + - In + * - Rotor speed, blade pitch, toe angle, in-plane inflow, blade angular rate + - ``SetInputsForBEMT`` + - In + * - Skew-aligned disk frame + - ``DiskAvgValues`` — the disk normal is a pseudovector and needs an + explicit flip + - In + * - Hub and airfoil loads + - Load conversion out of the blade-element solver + - Out + * - Output channels + - Aerodynamic power, tangential force, and the lateral force, moment and + induction coefficients + - Out + +.. _glue-code-mirror-rotor-beamdyn: + +BeamDyn blades +-------------- + +BeamDyn is the one place where the mirror is **not** confined to a module +boundary. A BeamDyn blade is described by a reference line and by full +:math:`6 \times 6` stiffness and mass matrices that couple bending, extension, +shear and torsion, and those cross-couplings carry a handedness of their own. +Presenting mirrored motion to an unmirrored blade would not give the mirrored +result. + +The blade data is therefore transformed once, as it is read. The key-point +:math:`y` coordinates and the structural twist are negated, and each matrix is +transformed by :math:`T\,M\,T` with + +.. math:: + + T = \mathrm{diag}(1, -1, 1, -1, 1, -1) + +which is the reflection written in BeamDyn's ordering of three translational +followed by three rotational degrees of freedom. In practice an entry changes +sign if exactly one of its two indices is a :math:`y` translation, an :math:`x` +rotation or a :math:`z` rotation. The transform is its own inverse, and it +preserves the polar-inertia constraint that BeamDyn validates on input. + +The blade input file itself still describes the **clockwise** blade and is +supplied unchanged, exactly as for ElastoDyn. The finite-element solver is +still never told the rotor is mirrored. + .. _glue-code-mirror-rotor-conventions: Output conventions @@ -136,13 +243,17 @@ clockwise one. ``RotThrust``, ``LSShftFxa``, ``LSShftFza``, ``LSSTipMya``, ``YawBrFxp``, ``YawBrFzp``, ``YawBrMyp``, ``TwrBsFxt``, ``TwrBsMyt``, ``OoPDefl*``, ``TipDxc*``, ``TipDzc*``, ``RootFxc*``, ``RootFzc*``, - ``RootMyc*``, and the AeroDyn ``*Alpha``, ``*Theta``, ``*Phi``, ``*Cl``, - ``*Cd``, ``*Fn`` families + ``RootMyc*``, ``BldPitch*``, ``GenTq``, ``GenPwr``, ``HSSBrTq``, + the BeamDyn ``B*RootFxr``, ``B*RootFzr``, ``B*RootMyr``, ``B*TipTDxr``, + ``B*TipTDzr``, ``B*TipRDyr`` families, and the AeroDyn ``*Alpha``, + ``*Theta``, ``*Phi``, ``*Cl``, ``*Cd``, ``*Fn`` families * - Sign-flipped - ``LSShftMxa``, ``LSSTipVxa``, ``LSSTipAxa``, ``LSSGagMxa``, ``LSShftFya``, ``LSSTipMza``, ``YawBrFyp``, ``YawBrMxp``, ``YawBrMzp``, ``TwrBsFyt``, ``TwrBsMxt``, ``TwrBsMzt``, ``IPDefl*``, ``TipDyc*``, - ``RootFyc*``, ``RootMxc*``, ``RootMzc*``, and the AeroDyn ``*Ft``, + ``RootFyc*``, ``RootMxc*``, ``RootMzc*``, + the BeamDyn ``B*RootFyr``, ``B*RootMxr``, ``B*RootMzr``, ``B*TipTDyr``, + ``B*TipRDxr``, ``B*TipRDzr`` families, and the AeroDyn ``*Ft``, ``*Cy``, ``*Vindy`` families * - Mirrored angle - ``LSSTipPxa``, ``LSSGagPxa`` @@ -235,12 +346,39 @@ Anything else indicates that two quantities have been combined while expressed i different frames. The check is repeated across a matrix of conditions, since any single condition -leaves most of the sign map untested — rigid and flexible blades, fixed and free -drivetrain, vertical shear, positive and negative nacelle yaw, fixed and free -yaw, and combinations of those. At the AeroDyn module level the same comparison -is run over blade pitch, wind speed, tip-speed ratio, the propeller-brake state, -shaft tilt, precone, both BEM models, dynamic wake, and four unsteady-aerodynamic -models. +leaves most of the sign map untested — rigid and flexible blades, ElastoDyn and +BeamDyn blades, fixed and free drivetrain, vertical shear, positive and negative +nacelle yaw, fixed and free yaw, and combinations of those. At the AeroDyn +module level the same comparison is run over blade pitch, wind speed, tip-speed +ratio, the propeller-brake state, shaft tilt, precone, both BEM models, dynamic +wake, and four unsteady-aerodynamic models. + +Three of those comparisons are kept as regression cases, each paired with the +clockwise model it mirrors: + +.. list-table:: + :header-rows: 1 + :widths: 45 55 + + * - Case + - What it covers + * - ``5MW_Land_noDLL_Steady_MirrorRotor`` + - Steady wind, no controller, ElastoDyn blades + * - ``5MW_Land_BD_noDLL_Steady_MirrorRotor`` + - The same with BeamDyn blades + * - ``AWT_WSt_StartUp_HighSpShutDown_MirrorRotor`` + - The high-speed-shaft brake taking the rotor down through zero speed, + which is the one torque signed by the direction of rotation + * - ``5MW_Land_DLL_WTurb_MirrorRotor`` + - Turbulence and a Bladed-style controller, ElastoDyn blades + * - ``5MW_Land_BD_DLL_WTurb_MirrorRotor`` + - The same with BeamDyn blades + +The two turbulent cases are the ones that demonstrate the controller claim. The +DISCON library is used completely unchanged, and blade pitch, generator torque, +generator power, generator speed and rotor speed all come out identical between +the clockwise and mirrored runs. They read a ``y``-reflected copy of the +turbulence box, for the reason given above. For a clockwise rotor every mirror-related expression reduces to a multiplication by ``+1``, so existing regression baselines reproduce bit-for-bit. From 151afb67ed42586237693d0df3171e0f6befa0bd Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Wed, 19 Aug 2026 08:44:28 -0600 Subject: [PATCH 24/66] Add the missing MirrorRotor input to the driver examples The two example driver files shipped with the documentation never gained the MirrorRotor input the driver now requires, so anyone copying one would have written a file the driver rejects. ad_driver_multiple.dvr needs it for both of its turbines. Also rewords the BasicHAWTFormat comment here and in the driver documentation to match the regression inputs: the basic inputs are named as a range rather than counted, since the count was wrong and MirrorRotor now sits between the flag and them. Co-authored-by: GitHub Copilot Co-authored-by: Claude Opus 5 --- docs/source/user/aerodyn/driver.rst | 6 +++--- docs/source/user/aerodyn/examples/ad_driver_example.dvr | 3 ++- docs/source/user/aerodyn/examples/ad_driver_multiple.dvr | 6 ++++-- reg_tests/r-test | 2 +- 4 files changed, 10 insertions(+), 7 deletions(-) diff --git a/docs/source/user/aerodyn/driver.rst b/docs/source/user/aerodyn/driver.rst index 4a5c766fc4..69726c084e 100644 --- a/docs/source/user/aerodyn/driver.rst +++ b/docs/source/user/aerodyn/driver.rst @@ -187,7 +187,7 @@ Two turbine input formats are supported: .. code:: ----- 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} + True BasicHAWTFormat(1) - Flag to switch between basic or generic input format {True: basic HAWT inputs BaseOriginInit to Twr2Shft, False: Base/Twr/Nac/Hub/Bld geometry and motion must follow} False MirrorRotor(1) - Flag indicating the rotor rotation direction is mirrored (counter-clockwise viewed from upwind) 0,0,0 BaseOriginInit(1) - Coordinates of turbine base in global coordinates (m) 3 NumBlades(1) - Number of blades (-) @@ -225,7 +225,7 @@ Two turbine input formats are supported: .. code:: ----- Turbine(1) Geometry ------------------------------------------------------- - False 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} + False BasicHAWTFormat(1) - Flag to switch between basic or generic input format {True: basic HAWT inputs BaseOriginInit to Twr2Shft, False: Base/Twr/Nac/Hub/Bld geometry and motion must follow} False MirrorRotor(1) - Flag indicating the rotor rotation direction is mirrored (counter-clockwise viewed from upwind) 0,0,0 BaseOriginInit(1) - x,y,z coordinates of turbine base origin (m) 0,0,0 BaseOrientationInit(1) - successive rotations (theta_x, theta_y, theta_z) defining initial orientation of the base frame from the global frame (e.g. roll, tilt, yaw) (deg) @@ -503,7 +503,7 @@ An example of an AeroDyn driver for a basic inflow, basic HAWT, and combined cas ----- Turbine Data ---------------------------------------------------------------------- 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} + True BasicHAWTFormat(1) - Flag to switch between basic or generic input format {True: basic HAWT inputs BaseOriginInit to Twr2Shft, False: Base/Twr/Nac/Hub/Bld geometry and motion must follow} False MirrorRotor(1) - Flag indicating the rotor rotation direction is mirrored (counter-clockwise viewed from upwind) 0,0,0 BaseOriginInit(1) - Coordinate of tower base in base coordinates (m) 3 NumBlades(1) - Number of blades (-) diff --git a/docs/source/user/aerodyn/examples/ad_driver_example.dvr b/docs/source/user/aerodyn/examples/ad_driver_example.dvr index 35c27d5f59..67fc5d15da 100644 --- a/docs/source/user/aerodyn/examples/ad_driver_example.dvr +++ b/docs/source/user/aerodyn/examples/ad_driver_example.dvr @@ -26,7 +26,8 @@ False Echo - Echo input parameters to ".ech"? ----- Turbine Data ---------------------------------------------------------------------- 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} + True BasicHAWTFormat(1) - Flag to switch between basic or generic input format {True: basic HAWT inputs BaseOriginInit to Twr2Shft, False: Base/Twr/Nac/Hub/Bld geometry and motion must follow} +False MirrorRotor(1) - Flag indicating the rotor rotation direction is mirrored (counter-clockwise viewed from upwind) 0,0,0 BaseOriginInit(1) - Coordinate of tower base in base coordinates (m) 3 NumBlades(1) - Number of blades (-) 3. HubRad(1) - Hub radius (m) diff --git a/docs/source/user/aerodyn/examples/ad_driver_multiple.dvr b/docs/source/user/aerodyn/examples/ad_driver_multiple.dvr index 8cd074dfe0..54b84f13e7 100644 --- a/docs/source/user/aerodyn/examples/ad_driver_multiple.dvr +++ b/docs/source/user/aerodyn/examples/ad_driver_multiple.dvr @@ -26,7 +26,8 @@ False Echo - Echo input parameters to ".ech"? ----- Turbine Data ---------------------------------------------------------------------- 2 NumTurbines - Number of turbines ----- Turbine(1) ------------------------------------------------------------------------ - False 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} + False BasicHAWTFormat(1) - Flag to switch between basic or generic input format {True: basic HAWT inputs BaseOriginInit to Twr2Shft, False: Base/Twr/Nac/Hub/Bld geometry and motion must follow} +False MirrorRotor(1) - Flag indicating the rotor rotation direction is mirrored (counter-clockwise viewed from upwind) 00,00,00 BaseOriginInit(1) - x,y,z coordinates of base origin (m) 0,0,0 BaseOrientationInit(1) - successive rotations (theta_x, theta_y, theta_z) defining initial orientation of the base frame from the global frame (e.g. roll, tilt, yaw) (deg) True HasTower(1) - True if turbine has a tower (flag) @@ -66,7 +67,8 @@ True HAWTprojection(1) - True if turbine is a horizontal axis tu "unused" BldMotionFileName(1_2) - Filename containing blade pitch motion [used only when BldMotionType=1] "unused" BldMotionFileName(1_3) - Filename containing blade pitch motion [used only when BldMotionType=1] ----- Turbine(2) Geometry --------------------------------------------------------------- - True BasicHAWTFormat(2) - 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} + True BasicHAWTFormat(2) - Flag to switch between basic or generic input format {True: basic HAWT inputs BaseOriginInit to Twr2Shft, False: Base/Twr/Nac/Hub/Bld geometry and motion must follow} +False MirrorRotor(2) - Flag indicating the rotor rotation direction is mirrored (counter-clockwise viewed from upwind) 100,0,0 BaseOriginInit(2) - Coordinate of tower base in base coordinates [used only when HasTower is True] (m) 3 NumBlades(2) - Number of blades (-) 3. HubRad(2) - Hub radius (m) diff --git a/reg_tests/r-test b/reg_tests/r-test index 8f3cbc55f8..e1bd2b7b99 160000 --- a/reg_tests/r-test +++ b/reg_tests/r-test @@ -1 +1 @@ -Subproject commit 8f3cbc55f82dc75d91667b39ac042430fd1abe20 +Subproject commit e1bd2b7b9901a7199b4a231b0a226a63beb2293a From a7253c1e4e6391cf33c827bd3edb8086301499a1 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Wed, 19 Aug 2026 08:45:42 -0600 Subject: [PATCH 25/66] docs: wrap long entries in columns during render for easier readability --- docs/_static/custom.css | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/docs/_static/custom.css b/docs/_static/custom.css index 6ab41b74ab..9952b9d274 100644 --- a/docs/_static/custom.css +++ b/docs/_static/custom.css @@ -1,4 +1,28 @@ +/* Set the screen width maximum a bit wider than default. Improves readability on wide screens, but still scales down in width on smaller screen */ .wy-nav-content { max-width: 1200px !important; /* the default was 800. allowing full width is too much on super wide screens */ } + +/* Target the last column of any table and force word-wrapping */ +table.docutils td:last-child, +table.citation td:last-child { + white-space: normal !important; + word-break: break-word; + min-width: 300px; /* Adjust this to match your ~100 character preference */ +} + +/* rather than the above, for a targetted table approach, use the below one by adding the following at the table +.. csv-table:: My Table Name + :class: wrap-last + :headers: "Command", "Description", "Very Long Comment" + :widths: 20, 20, 60 +*/ +/* Target only tables explicitly marked with the 'wrap-last' class */ +table.wrap-last td:last-child { + white-space: normal !important; + word-break: break-word; + min-width: 300px; +} + + From 8f3de282440dad1bd6d438c46fcb268b981d9f42 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Wed, 19 Aug 2026 12:44:41 -0600 Subject: [PATCH 26/66] Update OutListParameters.xlsx for channel split --- docs/OtherSupporting/OutListParameters.xlsx | Bin 819729 -> 819960 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/OtherSupporting/OutListParameters.xlsx b/docs/OtherSupporting/OutListParameters.xlsx index 4d7e6b2cccdcc9f62bd9ecb795a7f8e4c9e8491e..c2144441f09c64280470db56e538998d93085c8e 100644 GIT binary patch literal 819960 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%0DC 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%0DiuoP3~!?kv^f?0?J4RO3n}CV5trc^wBV4 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 U9}9~g`8q}>?FDD#y$IHS0EF7G2mk;8 literal 819729 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

m4)1NMHLhJ(M$@ljICX>vzCX-& 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

R-Y-&`+P)zm8UY>t(Ec?z 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

$InPrvJU=X^;EAwb&atQLS9^< zK5n&rx*oB@jWyofc5R!(8!+R*)q!P4=m49aXyaR5kS&50D}fHJYoJglmhiR%8n(Lh zq%q`?5(qV5G>A#Y&!D8(t{qlR&>C`riY1J8$E5bnwREiZo(yRS#>xE5ddlN8iS5LR zFKX+bg@OviT!&bnrsU7!yvG8V2Y-M8s{G7Hwe`3m$g+@y3!bzCuwk8q4=Ux=M-WDN8hI#75`}hz6_} zB^nTxr7Iv>C4%BuhsI0cjtUfH+B*KgNzx+W();KuJpG4--3J6;MtJoeMhx?6lo6o3LL$pB z;sfb0!mIbBgG5Wiiua_$NE!Tq^9W&k4L6t$W3pHZA>2Dbtt-y_9QuEbaN-p7X%lu$ z9$fq;`6?6AT~ZG<5=F1U{ydgTmG3T`3#Gn+nrqpEisdjXWvRLc16+GYQI+v*I2Ycg zAOP82;~f?Ei6p2Glt55XnT3@JRbWu^hZzpiDLe_#ip>2m`F>|Le7hk0>EV~*zI5CD zuX6u?S`GhG3KS>3V@IAK&1zZV!@l&7<-LVGeWK`2H{60@k)wj`cckJC@5!suls}ff zcXk3Y1wz^hyj}M{mOjb;@!rxm(g?nL-~CwnMo%1L8$p=@@jq(>|L&#lIc$;9DcI)S zN8(eG<1jp=j6KVZJq`nozw<=+ADmMDn6~Us-k1NF z;OKEzrttoGo!OtcE$3O*yYz&Qe2b}F@z!@3IM8hIDLC=Yy$27e626W7tN=f8jCSS2 z^#C0&r3n4W;YXi>B;0>zZGxYIq_yc!IFg{g9kiM7Q_$Pa!*hnJ(^2pP_zo-c1xpIy z$mfoA=#Y*+z6_sz!AAz+7jwXQWTY`0i~(Q&q~A(L){;4r{PCUHpLrtjl8O z*^TVH3Wi{)uf424Hq_PC76<+g1|PufYb+}Yjg^m+6Cb3g2%b-iJyEeKe(AGK@h(^H zP3!oibW{8j@WT4`{xtQ6U|_cU($6qKR*QUJSGQj?(un&qrEWvGrS*IlkCN*%DuS(S zrrkO2&~)8qHzoD_wGA51iYe*eY?If^y{{Sa`pGSPZ0Ovio+ti^^7oWewgJ(Y7Bj_l z2loh5%hp9$TC8^Q*m`4z3OU^K=%FUF5Fq-m+IFaAA=1JxKw78+C7KUz(>FoU+i1a? z%}9$!8r0(b(6IV5&x=-zz=Aa%aKQ(~bfjek(n6^+qCWCoN)wckw>;<998Z5WOK>=X+Tsv1DSmqX(_*fwCrmG&g0UN^IOn@ z)Ka8nJg`M2Db*<8p?uu7lx+jIbB?#0DHq-I&3SN9*73yl$gx zr&L_q3B8#Eo)&bKD=pe4A6t#gc)~8xoD_euwb~Op1)oHo9VbC3G*}44NZ@`@Wv=^m zD)bFLB~b_011x{?LMXHZB!;eWW~OyQH15Nv!CK#WAchKy3AI9I7V)}Om( zMt~s9sDnXR5~SMI_+^cE+|Ll34)DYZ0Tha`tegoa%wXr5dOptV#i=||a=mGBXWvZ= zj-^?M$G(G-7xP zaRF&b=>vP1BmF51L6Uu4)I{v3n>o}CWzKb5*`f4K*9qSf(G&6q=W~(@ccmVU>-=&fN21pP#O$_AxQ%XC@>8&dr=xl;j07iLGnw2 zA$dY+FpQ#LuOeMZobz=C2mxXo1#oecej|K5yC@YzA>J3@1acWVKL$}0-4P;;82{fR zf@~Jl{P(i}kZ3py-gX|8Lk!`eJm3HBkW*d2aXPxGN;**6Xaj#H2WtXVme2U@^3qj zP9|q<+~85(NCO=};PH6`Ldi!IaGu2c1Th|SNCwby+<&Hn4-x2_2;B7q34h1K@NXT0 z;2};t^dE^A^8hn0LVwC(__w|ZG1?lnFe#B*;9qsh7;0{e>A)1b)>$(|hkLtI zoaRRt*EVxo)mTpI#Kx@Djrt5za1-j0v3MN4GOAcLO)F!5-6d6iLVs~MUD4CFwcm&( z?{~MKJCAd`_7ztU!GA)kh~mb#>52vU0S%uWG$b}QitE+qPko{CPBiac9X>s;NGc7dfkDtZWk)W?0o zwZP2`w8$K5y?%vmOe#hl+LX{j3#4C3#)fb8H5q{zQzwC_i8#5OiI{ zFa=?lw+Q**l(e!(@Tw4{DQ?KcF6# zzu_?CqVflHO3NP*M738^PK2PGz}hQO_Qx-tC7{!Kxu7@A@Bxrn=n%E#wWA0kANN&J#sE?&0BAnL63+X9!9&nZ^U0M5qFIV6Km_5^cbsv4Y%|DgUyh z$^f~o3P}yN@wzeFIHdJh1r0*kZCpz0zkvd{p}iLaa;g@nZ;>dm-vc7rL33XaP>lfH zB0?CJ#r#&-N&=>iY^PZS#NEG9`TLF93)`67m~6OzR`6kA6i6Dy;a8bDS;z4QkYI^} zu&05j0(fAqkFXMLz@xq4aQT-dm27kQH|-67(*?Mp4fn@yV*rkQl8*hoAi@I#ptNu| z>MvopC@qT-#i*5(*-rh1f4S~&G*|vFttV<@Oi#f5lfprTQPL=mypGn%jBYMyi;1Fk z*c(Dr0X$<^i8kQT-cVZa#zf@*gWm8rUEs^~$8Tc*&e24B*s;GCM9Bd{kN+4o=`v*z zY%{2p96e2N!T+lO>+W% z(Z^rxee}~e+%-$rf4SRx_wFC#k9uOmZbp6|Y`p2S>FUSt-q_n-VLIbLRlxNP_0e15~_k6K@89DHk}VYpFoyY(zM-$5~>0k{N*_9 zohYK&7*Mm)tAyTzwFFMKsHJCsH*}EWEEezvX!P!ARhFlht0A|R4kToaG*x(j z$y78M4LF%O#UbrOvmpcVMY4E&lq zn~v>Vh9>)Lgp)fQkZ4n;{?2Q0x29GM{=BwI&)K{*nB@QT ze&P5T)Bv3zBfEef&ff;wkFTD)Rp)`t z7B$xFDJhyt7S5_uf*&5uF}${TD^REu0yR-Dn^@bR3_ey8)u7wJJfSS4vuEJ-YN%a6LHk{dTZsHQNZ+8Z#1BK6^rW#;h z)Fw>&*$l@vZm{JED6E*zHnHKn$L%R1?IxaE!IWYH8NMLT`v6YTrpn+*} z_?WXR9gnOE4!m}>*#u0UZNWM+C0P2RWI;c2cgh|hf|Mekpb%UEy=;kDJlPXW1}kro z9hV5nOr}fZ{}z)wKj1S2CT8wrulE548RE5SXUZhKsHfkTXlet&wX!!9HF_I}S~sH0 z5kwa$nkF%bE_zW?x&S#ymr5u;E;Pyn(FJOh(4|yDmr_I*y(kG?5YCV;F=r87V$MRk zc&-{<7|{g~1JY$U9(SjB0RACOFj=BZ8q3j&kkyrKI~KGfg+LR`58xWi4~d!arFS*} zd9tT2aM*r#&iBmL2aUhPul#z_>~ZRoW`|B~{6!lLY*mJ8e<^93KMABKoD6amtSEhP z-i1ptbG6d3jiWuW8*0~`cM!0LfP0F4onnT-D%O$O+_*JlJw$XY;x_W%Y83cYPd z?JB??xpma1kX5p`(Wqr+!|L)^p$jUfhqnQ>_%%1kC9Lq`(yFFhI5kN5fvf!Q&?@x6e-9mXW4y&P=?)eBl+ z_+)OQb*ppE@2?;K2_gQxf;l}nwY1Ia;|>aYfZx0Ef80TT{|-v)It-c$)Snga$@$(M zzgl_ucr)eYGt?yesy+VN%Aa9ZalLe-^0bLdP-pSzFxcOvFIA5kZ*4#SITV4FRJ!j= z$|`zs0ZqUIFd6g%F4A%0rF|&u+5V>O*l(B(du&J*;Qm`aLts!R{2st0+afrF!aWuo zK4Ci|dmHWT(HZpDJ@%hRh|z`78T1eA644n{?c)ymaR-%dCx7x8RMqR_85C4rnKCRr zB7gYk{P7I>`}S9(wM0SQU|A6>FSeUaRb^v>Vk+{?sSf;B@ZUObCU699DO9R2yGP4K zp_r`~cZ8R{qiq^#*}v>EbnPuOb(szi>aN5uYbcs^y}f9b($u;u+PA@g)>cyX7L&Rw zdrgSJYL~Xh;rrMcm$qx-`@GNSHvda4Tvil(YW(I^s)s^Hd~4&uRxRU*`x8LlF2`S$x|hhP0;uZ$;uKlGH=XP znDH%|d~-fp8Ha@0C1%)y$=zp=&o*fM1sZp@M!;mW+RYdF=$Bm48H`9ZDyT_uG>KnV zzzlAgrgttxA1eF-YC6s~2CTXe# zOzDfG310P1ejpTqN|8@cXyk2=>a}BvHeHsAZBNT~sA>8Ab=ug=I8M7p#OXP`qdndmf?-)F`0~ zK|&V-qD!Zdgf2)Eqzecdq>FF^q)TP^=)#CD{0Kys;b7j$F9rNVnqabU=K1hvz!f2@ z?XcS-Vvs_p3D6nXhw=lNnM1fSTY)n#pt=b-9Hu+i5=JKby5~j*VjP~|!8mm4db{Ud zfdgv}O#*7&*JD8rU)m0R1i1=Vl)M1m2Y>E0vRR}F%ymBF^z z5(Wyn$3Wx#E zpu@rZj}8^+47&W|8T8{0`rkQ&(m$R-!72K8pMF1{L4Vi&s?sZ9zz@C-73Ny(JYg-1 z+u*|K>|u5ZdtHcwjRRzcD#eA&@`_RTNuk&)FVYK#V;Bm=x7hQ%&zD?U%2{mxQ;Y3B z0sSy*XD<5@JvOYnE6scsmP__K-y5LIStZN${}w!r2Ka~^D8;z zH7kPbTkdKy{F9$(uIBvN!1)S*)bQX~lw5^%%#|l71AYYNL`q+D_pIl>6-Bj?9D(NS zxMl;!>!apA#oZANJL~#2NEAbVU+-RFgD26?Ul>~N%AsNn`Fq3z-T|q?K~|NBTU0FO zmvtr7h6>xnwG0~uA%VY#=mD7>1cX+|C9pHaf1StAWLf$?ocH-_K#T zrMy%X@t0C#f~ZuCxuC4LUqv)QBpf*Ks$(*PuAF6PBWi1K^P27FLGNbaYE?N}w>YA* z{w)OeEZwYv?g305hMTy@-T!Ry_d4M5*naqU3O?>|f{!)ualRXq!ztDw5E&|rCimKt z3`Povx5ZGNF(eG|qcCn@AN2D1Y+KsKRy!bQia~-mzE6;jb~u93u1vz&Tjjak-8Fu~ zg)v4jczBS(z2CuWm>e zZmN-!&hWRl2Wv1~fPg_(0ml{E3g&ZPyppcS=&zO-+eF2KIpY1$q~0xAZK)C?3sTld z*W|A68lJPdZb&FRD_Nau!W|yYmM;I)M(THP_a2}wT;liBx_F7o;NHCwzo%|~4yHQL z2sjtIYl3gqHOBry|8=yYc5VoPRMtOTs1w_&&O2mQY(7wPFPicuWtRc2#MONdhm$~K z5Wx)?Dq5AFR$QUzDRC=wG09H|Cd*R+Ucy}iHP)3d62r5EpDD8Y0klwp&mH{%!~iUN zycUKJtO~SYYjAF80m&=C4A?M6*~pw?wj%lgS}v>N9ditJX}KYKj3sy5$KAGHw{FL4dPnr-;Dr;BZdze+~KjV}s^!_*$Ki zUvFzw0<>mIR0D#72&O&Y^Q%NZA@mVoLc#D4F z5#k5btNQOUJTs{-ToJ&|+*lP1M*QB-SN-eed?0)0541 zBxZfCzS!6D*!1Z|i=TvqXinR+Zk=E7gKO7Z*IH~X`SKe1v;#3_7xwE4FoanH??&q| z#|f+B_JoIsu1m-c{a&v=au43EkU}IXT@r?NFgkiA3Q^tW@F77>Pnm#ehVi=S85fwxU8J7ljl9 z3nOnx=dz4Lj96nG*Xu z$sKBY8?~x6=`)Fij9>1@-L9OeXtu*SOkRDlPVVvP)0LP2@RRsG>vD2aA6&Dux3<_C zudR8{(f@=#_39n47JQFGYl0sozUHP%pg)Nh9vhY_@dnX=NNs051#RrHBPC9`G{9rFCc()wo?57pigH zqQvtQCCAfVKWm27`uL+=V6ba_yc4)PD9(;zI>qms7W?`|X@wni>yj;crr_6HZ-0&C zFgvwsAD*Q%CZx*&Y8!Z?9{@+wswAT;_O}M*<#=AVut4gsTWkUM1f}2?y-Ah87W>vA zICqZpe#lPpp1B9=(tIPaOkO(mAJY4v2ekCMMLW1BQ2iyUqHH8nyR0R51L^&w6;$Qe zDp7S?IyFjqKO?;d!MmkfPNUO7OvoW~prUi#BDN*;yY?F$izuf0*MYXzl6f=64NOTY z1K9mLmz{9sFzL!x(v>84Da^?LdxwhRD+pevSP8uM?yrLIu8&V{hgd2x5mZS?+h?s3 zcn_6H;02>?(8O}HC{-23nv-^i%5<|{xIEU)tFSACqsW1G-8(vGTyaMMgi~fnr~dl> z2dbLk^mw{c>>Xq)uuAc!g)Ah;B0Phu+pU%-ZhmdH9a{cxT%wpAolB!X=tS?(CINTo z5uhzXBL?xt$|G9p@F`k}6%MfgmY_2h+rc9n*7+Rbi)*YIkTwk`gc&0K>ip4F>!{ zhWC1~T?D-`9g14v4BJ|IMzxLb0gcMrFLw44uvyJQJopE~IG`c&t;7-u!U12I|BdHp3NN}C0NG2X3 z3UgW&#O{K*`YdMe>(_Y!<(n}FXw@X$18LRFg@?@i=r@uMhLaMvcj3>@xNG3@N+&6A zFnY16ujzTU%$R3q>$W#>`T(;?=*Ib9`e)OhY>r^ZJ?ixq$Jd$3weP7?bYo%b7vp_74 zv*VI}Y~_)&4(Cn%$U6t{%sbb@N&b|Z9M0lZwM~ADGil~PCqu7Im>FV%;i_!x?%wH~ zUXT!CD4F`^2vhnjuw56^VX$){oB-?x26oG648G6VwJt`wD1VdidMr;6d`9_&s4X2F4ljOAU( ze}*!;zvXxVrxw`rD*#9?efRom0AK-h@4G-Nd}wld!*+r?kDR5P=Sc3s=nh;p028i- zLqCfbud?aBvvkR(_3Mdv}d>d>B#? zdJr;%X7OU3+NNF2XUCej_FJgGbjvYqz=2h@YyW{>PZlp`r^<$Aj2>jIk6C;huv`_o zBf&7xpBj@k;Xa5W!#FU`6c{M-6Rj+QI2xdlnes3Hy%U8d~Wi)Z!Kbzu|HbR zF+JQaWU(65&R6`ay<&Vju4hY3oWP>zTza29e@*+daGL(5^gbqK)r~ko>cxxTarXCM zl-Nd2@4NoFaIn2i)UsdP5F4xN#ivrYf3EUHXE#AiYh_@4&C!*T1)t^66_*L0Q!?OH z0bTbo`nwq-N556K<7_*_`J7A(3Yo#^4QGf>b50QjY_ZW-VII7N#l zDq}TV7<`kYSNn^tSdo^d>mR_gDJ#uxU=7GWh-DJI#Om3dvEb%6Lfr-p;*56s zB?t0^qcWFZng)^8acL;h8n%gJ|SNiYWvZ2v%vaM%mTvP`qC*_`JMy8 zeCC}$%>^mcANE!L)!?2rME7!UL`&)rCwxB zv1$yqL2~Cbft;rZw^YP)TYSb)uv8pFQovQ15P72PSYl^)3@t?5>adb37I>Ktng-P{ zYa8~b@awVRMBjnl0i3D0Ay3@hE$(H>3lDG@hIL(rU<2b2iD!Bq-`T(y7Pa-KE4uRY z`L0;bK~v%;t_zW8Unu4kG!Hy}a-gma>z_sQ6K);qr?v$!^l@j^5NN;|NdtMM3_o%VXxiYf5=0WLzRvSU+zwx_) zW|qxbS4~jGE6iK(cf^YS(ZOps=-~BZ;|dBr068;s4bR=ji33<|#AYIc)qP5V7|svG zsBVcer12^owufKu;RW=yn(yw3RB$cD%@*u;7YnAQmYa845_P@S*ea_$WIIm9tr0a_ z=i@Re)6UV3#AC(G{pn5O{`7x{PcQFjG~l_41)DOM;-1L7{yG6h)Yon!K1r_Q5r>)r z92(VHqk^+9v4^g6NynNeX?e=c|(3zm}&P?;-ue z2p4C3YoO9;=@t#SQ-x}!C6Vf97v&{Y?7eI`NjcK=)^)9lg{98CM?c=SRqxKO62#l8 zyJlBCxN7T^y+7WFuvs-AO~-i#>Ggg->(%8I+53I_O++ zE9;7W)P3mR6qBqcTua0$Q;H*)NxElL{E8y(G(W;~m33`N^K|1fTk>BYu21zprA&Dd zQ8jRs<1}b_X(PAy^QcbA_n(|uTZL#M_oviysd{3Ev2 z7~*uE?lw|qw-Z=0cK<2;Op${@hi=%3=uc*+A4*UY$Qn0SQ3)4B{rgu17 zE^$4o;yF`gWy(bJ@Zh|nTRDB~)&}i~3Z$A7v3XCg?=QWUHn__&v+qQ-o`zh}tG;-X zLQMUu+gDABPRG}R|K?y3`?8fvO>}a#E3y3UEUgp=d+n($PY!21SF%18SrfG;)+OWl zm&~tws^Z%Nekth6u=wumotLZ6`eEHXY>(tO?Fq_kStoCNVa^1mbMno8JFLawnwKp( z^pfy`)|{E&R4E%zHNG%@Vn$&{xh=!g{`6jVV?(X+lMCpZ@*2MS>XKDg3N~7CYTH3Z zp@zyO)9qNTke_~tU3iMlx-M*(qf(VNrB3b?{YB_!%9sA7p`6AUXWqIlXuXPOrIT&q z?!8qdb)-2nd@A=){7Y6x>@&hHBrDo~x7YoZzin8<>9n(1uXbJix-Yt+!Q=$GaHbx~1cd|Ith&E4#;^dg)2-<_`UiU0Ad?N^U~#Ua$U zXT13`KYNm2QRs{xm*`ddC1k5A=yk5pvK)%WRBmSk4ieJ{pgkB*okav}%WJu$qcI+=~{p;Wkv26rd0@80}c&nV$@7H3kcsN|)d zbB)UcqX#uTJE{*D67CrrCwE=IeD8fPyYyfTcPM`8#;Rne6OmVLo%bVA;|jgfuf#RP z6=E`H>QyJra$7TLVA(#W@5kXzEU|FnN2}aRJanS|MS-<(64i1U&82ng*=SFCLv*e2 z7t3~$@W&4r`sdC$S(JKR%Y8Z9R^QicxeoJ{i345e;#ZWK23F&RZPtszbHY6+voIJ{ ztQi@9pmiCm;lS*RN~E||OqFP`I8Q`y>~u6I<2(OhdeWkP*(nX_(#L0E$j?1h4jmMR z)vSE*MR;i#skR~dTjnXu_U5lc>bUjaBn~tzV|hF078%)h=P(WSTUWP*Q5lCu7mHcO z62-GtFk4!fdF{(IyZmzv^tX(2w=do4K+i5+LEp(>D4d+r)xPZ1occSH<^6NxKXW?7 zC=EQH{4KNPY}JeFTkezbN^-ne7;3h`p4_N=FH)cEQ8i?mOnc%z`){w{4y8AOI`ZauX(dl@V}7p33~LY`{@mlWKYIZM<2RCy}B#1NU-^! zy1q+q;$#23T0^&&y+5DVa&oRY*_$fNN{%n}{~2FYYhJmBGiMT=o24Ho)CoF*GbsOF z1;c**r2J)zqP+L%SjJ*%$Ew_GxzYP8J?Avx15I`4Npsem2{hHECk2=)oXbm6FzCEu zZ0AtwzQEdErGkLn>kxWGmAaJ4@}|o@PhAl1rxQu$eNeW`4!lV0f?5O#a(u9V6L9WTQ|DMf*nl^%n7iB@am zeCR66H0AX2ne2;rQnJ0ii+1bzyoRuv$}E3FeL&ho)@=wQ znNGkbu{R12=)6GdQjOSFDj4i1LR>a;hG~DXS6SCM;hZzOxYy-sz}Gkz8kYC~L_H5g zeWp3*C6?un0|EQzcj*+Bj<3R%_-2pFU&825JW7qTUvjXs=98MZKz)}U(m1a}dEWH; zl+Rh!Sut|YnAKX-Va#2+a2A!?7d(o_W$RhZS4kNg^PMo}Z)VBHTm>@{bD=kYn%dp5 zINV7*-Z(Ec*TGu3XO@@vDn_nQ>eq7T+>(gu<7-%!Qu-Gb z=OqzW?{C4cWFDUUD6{?6i7?8Q?AEPjZ-@N2+P@WYZ)?6H#j~!SLp{}(nl#Ic*6~fa z6$#(@qai+7hgtbk5+qy1KJ)6nez@q0C*8{1Am6th+3&xS*{uSCr=pfGZ@B7aG3kUl8Ae!n$L;X}W zdh83U8-8?_dap(}iDoAN!8e(KyI<*Vbzk_zKkuZO$h+SEY+Znl3bl(LP{s}&colFQ z?}59U=fVf+CeMBqFlYhtsxpO@;^1^T?_|I@aa_mD(Aj()Q8MI(V86(wMq33lq#>jx zcefn{lQ#49)Xq9g!m3t?;-Ad%N>wA`JjVE+&a@@rt>!P2#@qZkAyCukGdG!x*n7ag%wuKZo)H{xs-Z@tvgwqdIZ!Pzvro2YT_xKEN!L^ zD7NF80ro9tH`2yAiuDVgx4Y#QvD{2s@aoH0r}6?Gg<18bdghkZ4poQM^!)Y+ly;(amyoQ)tR21Y*hfIiXl~lf7dz%15>B3LMq zp;p{i+f^z=U4m02;QV2pr1Bl&^6z$$Uy~nJuUG5;*~glnGMHjOQs%UJ;WDGdRXG8o zPCB`vxRc@J#gA!ai$dMEbJ*R5wW7)#r6hhD&qxy!bs<4v_QdV!HCfk<@-Y;WNnx;@ z(Mo@YZ;jW$=RU6wty*C`sW|u9Ig*m*vM-{~$Db%{JF#%m3g_`Pk1p`zldIhOYwsU5 zaLVIUCwe$9tm>Lz_4IDqgDZRbJtJv9qz?Ym(&M_5Xgg2gs_0cJhbu2iS?1VlaQx0o z!p5uowAf|0`D;Wk9VxS3iwua)#+XP_=Beku2(!+*)p+e5UvyIVdC>lsjk*Fh*{N39 zGO+Mv#?gopQ3260^)f}rXyx+2@igCWy_7Fe0~xC>>Vc_`wUnQ?-c(iYGM~7A9X7C9 zYZjgN^2IOP2JWY~uDH<34iN49v1V4Hw~qbdLHhfcDW zH)sC%<<;tPNeZQQ_Sh#^XDw$BwK4#zz^ zIPT^SKX9IZiq@rVdYa3g)J+Ke{3QGG_gz|F#>cBRy!^uQ+kO5)DX9~Rl=8pVIPfHM z(hB8g-v`bNaNnp<8#?jT%`|5I7qdUzOgi;#pyiF_>W*&9zilfI@;vAvc7FU=fsx7U zb`|$_a?8YmNaE`QRNsDK8BNeaDbAv;8sbD!C|Q1<{e9e;z#z;)tlm)ez!~41$7}s2 zO;R9avCmu|j8vx3n)V78#B^xsS`iDlyv>^BxWj4w1>J@|B7s}5IgK#LY7Px_C??}F z(|xz!!qE)9+3mbRj2wnxJIBAjofqpsnM4@M35|4(i*^mc+)>WT)b%!3>r!-$6LnK# zQ!wUQlWc9Uj5ow&AtlmPp-#kX=N3|MW|=RlOp048DqL+d{Dqw@?e$&ZH^naaxs3k& zQ?@kk8%CajmUxw_f})i0*9oOYetR9l+4(P2yCQ7#tLIS#V&dM?e;8U$sz1O@#Tm9m zn(~_y2;2-@)|*HzeslJMHwB)&W+s7q183M3SsJ`DCmZ&xU)V)7tln4y zez=qfXZ^-wzzwU=>;>A!Yr7-E`ORku+(evVM`SU-Ih4SCxJy)67CU~YFzy0X>9!@y z<(GqL)T4KsS>x~idf;HSi92!Wp%@$xy45v68GCa9gQYKRoJ&1BblAzV^w+CFC;~Woz*tLbNa;5VQyD~D%GC+Oo$*gO86yR3tn!cbycMB}$Ke60muaCb98;;Ff)!5AHmlq;tON@vWtLl{@y! zk)Cz#-k#>+)_Xu0J;|i|mA0HB7T;0-@bJ6;T-&Dbl9mSkdAl;LR=HF~1uJaEF%k2u z7SY0*g3$th>5`M8#i+BUaeIHMdm{E{b7BL#DY5Q^?R^5?U=b-2mr3=}HP9d!;G(pg zX6pM1i(+Fp_I9?kRQ1!mu+I4W(#cB>SB9?oslqkJ;Z7)ihi+hsDF1~`#JH%BKV)D=>k|Ftfa`7+4s^YYj|0Jsnk}g+7Vt4oRnicYW-G3o@ zyeU<7v}MeBqpkdAe*kx!PDkOmqA@>Ac=r#=Z{E1o2=0)v*0kFX4hvZ=s@)eqFt;tpX})|$C=t1^5bgE z%SoKg<)napnQ4;}>N?dsiaah3?#JzNjmy5L#UA7)5Jl`FQgc?zV9p2sM2osjv-k(o z?icmhnUk7xZs`<;8XUTyXjQ#L%QJD8t+Qi7MrHB-v^0U}6|2=0v&&VJb`KMYD<>6d zbrdy64z~0a`nq$08G?s(T^*+8l=PG`+^sGWpk5VZM7%H#@^ypw3(a@5qtIz^eE6Qm239<;2lZL$C<#D%l+`7+41eyrY`4aRwRq>Lnbiey5jDWq02LM)Mw8VKyN$NT{j6w^3nJ_1ist zUXu$gS)RKJYc-wHYW8V(QSUXoL?+R@9$ui@lpjthypBz51<&rg3Wb_A?z<=~ud3)m zUk_R#+qyiKZtAbg%NoR3`yA1GTuPwfg%`;F^)*^ZC*#z)Z&kL|0^)0uRc`}dJr_3 zh>XFvu*F(5*sT=J-y2_YXkUEAp?&ymDd%%efj@U@&1UfH%x0*0TkYy3Snayfl6Lr* zo`LV`5C6%HQem2e<74ttOYP}x+N^<@UcO;^2Dwqu^(LlnF>0x$Q|WCJSOcGW`TnG5 z@E8r_V`5TEx6|7eu?D7j`G)8j&-&1-9c~Q|!lVW^KD;oZcHSmd-?@_(XM^U!*CR%PWim9dY^foX&#mhHX zFY{@XZKH`6J|;4?bThqe0c+r4Ra*ltI>Voz5@aEw7zz9EH2+sxWOkv0u+N9)U!sL$ z7goJ!6?$F(x5K(MyEGm23Y(oB(ynwZiA;!UKAfCj{lYWrO$xldN2ae~z^{~L=LC8% zbMio8jIeJP&A(0yH&7TUJe*u={7Z?C5gG z^Ss?^cl)H+X;UxP#M<1v_>#W2b`gnxul5>vJk+%~=U7X$llh{B%e`!oB60e5os`|w zbwKCj8mP0Y66$n$h7>t@#yGQHc!mO<;mJ^^UJ}wtL5kwKOseRqT{D1A_93VfgGV~g zBSjNyqaLQk)Mx;mQMJgV8=S0t0Br4?&dGt5t04s>Vn+GArpf3Ke>9z&2gdf<&j4VJALPG z`L!$d2FIT}yuiY4$xZ7C7iMl=Wd75F+%=oScAiszJjH%d&ZnEhZcdxJMEk-v;|EW@ z9fRXT?0~?w5G1=0PP@1}xcB80`{`pvEjDRCp2C!@4%H5e#-D@p;Q}LCk*H*;pbIl& zzZolvmQv8rHromekP$^zsqC`5H<$FoI+L)Sd#B#b2i7^Sp02BH2Ju*s+g3#gD_V4B z!aM#KGU3Y1%>}{Q>$HzfwLfR~iCXSAIiH$@ZT-89Kb-JnW(;Mzot<&SmM?Q>E+Bms zroBn$`08lfw=x{?$V>P>_ZMO_|`sbTimDn!?yO>?45HT z%-lNDUTC~OY*EOB=QFQQldS%&{gRu|wyn>MZY;<>sO~BUxOFZi5YXw_c{JtHqcH7t zX;YxB$d2YsyK^lzZ4P@f^E#qq(s@M6W@Jm&lw;Z^#B1MA0cL!|-2_p<0aUIxseeC{ zIe<|+t$k|)P?tVs+x)59Zm55~Zt2$}FIPjZ%-lY0>PiTTn_bv8*Iew(|^60l>X0J~Zfsb1V}rT$Wk-a{1Tes7Cx1#!ZL^Y@VC}tk+#K0faDn>|3K*b0BA2)qtY0NJINy!x{YSJe(sZsxo zU#*uot_Hd5{u9IiJYEr?Nu8C=V#HwC`uh%f)EWFY$Mu(iG$sA8Asi-mVl#qZ(q>qy!DIZn=WzG> z6>W!;&jM9;W2@2nzWD&kr7>}qB>Dd!kKaRrGoX#}-VgR`(a-miuS`9reM_Sil=!WO zO~AMd7!Mil|@O_#nBw`@L?g9>?b*CX)qKTmrUaTrNW}j#Oz_?VoR&l!ZeUf%wjH*Z0vv~(+=VlspS}Y3)q>&P zT@rOzIm?R^N4HipU?OE`#&Cc*LAM*ex3Ij zul;S{lj_`l`Q!B#t5d5b8}Xa!AI&dEX{=k@|II*8OjWR9x$d63TlD~=d) zb~EkM3b?==Kb|=M|46@_4(0$1S|Y9jYbI5?A4V)^*!H>Y)56pQt#TPgIUpB>Vbn@Q zHDVRHnl!=83VKW!PXA8=sNXTXtD*N=@B8;e1ty@QUx3m=)4jY|pw`!P^TTrO$0vNL zI#TNjyKg2Q)>0YJ9#5@%l)!13XrnT4x^8#ohjf5`*lRxtlpfUR{tj>wQC=f}&xBE> z0SreTqXOU=)}qTcH}+3>n8pNfJl6$Xszf3>-`Trlf9&aaGeF*v%4Y0_j;cgPL6V1` z4;NjoXDzy^aQX*%hth%l6Btu~soX9~2LO(U&XYiU?bXTt)5E^Ad1lis%?0!4&Q5Z- zfPe%e&W05h=cxnWsj za41+>+)k9PXm11q%(Pv4z=*RDrI~AyHEz65v}hcu3leQjD>+9ql=WY84%nc#Nly40(w0k=R z`6t|vWuOSfY2c9j-y6d9t0BxhMHN*_4+_rjnq?*fBE#t@NdVZ4{7^c@@IbnV3i<@- z7JN$9hJ7%3j=Wm*FdSzE5m*PwK34iYU{(VA#jz^Ay@RAM*2IPSbGdPc8Aw@+-Ug;^ z0C^s8kth}r@aR1l^#~0wa83n3R>XHU|5m?ncn=l7PS$%`2 zW4#~p27N(XJ4}XF62d?v+*!`A0DNLpA05LuOoH=0eGMl0i$d<5Qnt>GJ+YPN1jK@Q}&=7?Re5%pL%Fz=v#=Ljpm$ zQs7_lL5~$&59$8}-uF{Kinbgs!uK=?c(H;K0g!{D(B&|u0_3wO;IT4CZXn3L1^5B5 z6BTQB3?^ctbbvn)S{U025J%Zr_f7aBjz}O0O3E4&glm&#ACEN0WcF}Lk`1_h!w|t5D@Mtf+j#8 z@E`nl7sYZ9Jc7rGpPZvm1bWOr_mk_O^tecIB~)6|kK;OOJbwNDwe)B-ZVY|60N{M? ztY7#;6Q^fKan@%UY>wl8=0frqA_Jk;u%lEvFX3^t$HPLaD)p%To zO?-E@jC(@W$DQJ8f{y~Yz-yt&UsrDH({RXVfSNA@Jj>8K3bZ3>Boboc90!Wgfy8nJ z0YfzzDH;4N3Bi+uWzj@KOkTvtpa!#=h}jHOZrt|axNoNn4+3h$3G+F@XTUYGEcJ075$`!|?(-Byd~RfR%s_KP?0S(MtdC(f?Qbp}*<@ z&I*_Q1t2&*0_7q2T_=*tgC$dt6ITGGo_z$(*iY^lxaeU}hJnz|`BjHp20Y5&G1`Bw zk}EC&&H8}J{%7J63Vk+SJz}{wiQqY_g&5SH!}<)!^oQs`;TAaWHbTdv49jJrl}HPz z$Kh9&Rst<#%!fF@b$w7u1OX8UEP#xRS>iOi>^Il}Yti{bI={da{+)gpq-$ag<;)%Vm&6P+wgw&%>f=K9yk@j6h)> z6h!9BcJ<$4;@@-$lt9KID$R@FcdPMAM4_ zqUBf}7Ym@V`ign{UF!n1Ja|>h5s(Mq9%yRmHp6-kgefzbu-v-<0$E(7vJB_U+WxJA zSR#V10ASn&T#5h!03x*I@EQNs1i1SF?@&+_T>_tP!k6p#=%o#SB8twYeK}ATeHUhE z|5(%2sez^&KZ9V;VR-ET7ouxo9BpQ&dKr0(P^c%)1^qV5$9DAFDNU3lC)=F5`{Mkf z)AjeQ+eXAOoN9OSthIhTDpbvpFIp&({p@kcE=J<2e9^R0O$Xbnc~K*>p^ho$G4#8- zjdr@wnn5BzhsyX6%YfJDeu?~MT+?@6JIjYrO9R8dhit0I+MiL&7}qSZ=WQ?K@?M{dS^ZL%r-$-w}04BgW?-IRuv3Aq}QNhYBG}6k1uGKi3KBj@%N# zIaV!i*j&66ycdj6b3THuSGcnoStJcyWHz!$q#w^0M*%a}*Qd{t(oh;R>C7B6wH=K~#?kwWB$_`QwB$ny^0f1eng8UM|ca2arB zJN#vc9(fDaflyO+)b{(ZH)wbMAPeUef9JwzfAFMEXQF5j_%(OQFPFo9M-^i>uh~SQ z01!#6J!V?0T8wDSD$@9i7?A`#;wma>an2$=jPK|vxZyBlf6sU894P{vhy8emVZbY; z^8_#pgPsiTF#b8Q7B&Rjmp{%~G^<-A?{)<<)1c^xEg>(Bx=NAQXlvF15) z?AQ~AEEWn^50%jK-5tJ(mbkF z{(WL(W+3kqMPM1oG&#Rsh9_7Cju>tT$7;YDE-e`bxhg7~H$IVi7>V29ktZ)T^9$}G zMv45TVV$fc?ql@*VL5!2cCHfU_`gKU|D}pJ3C3y?FZl zq!^FYKnxI@xzt1TTUH<%4Nh_teb`aC!YC{}?Z3;Zzs1(SN{sOIyw`(>VIZhbq&0v| zLPfd-SnId-AFEhQ&`)Tlfx!kp<@0IndCk@+E~2ZnUnrT2eOsZ%;1m}sb`c{&jHh1z zJH*2^RD#e8`L1CraW7U>%A2vxbICSnuY@yJO&{1HM{jhANx%|I$%IvmT17J2^A(5b zxJ=a3f`?yp%@+iV7#AzyDFEKD*e@{bD=^Rkz&%rW;U5EH<;Uxw#s6;*LmRxH4%muy z2kru2eC=Y3N~(4vt{4CF54lPMxw>XM|97}rYk;9u6aU%u;F)!N?^1%CzdfHc!bsq% zbj=a|R^j`Bl>z5~5$ynB6OaMuo0i!LE$$}}ut}l53CGU=6ftzEqbZ2d-Gk>_8PDXa z01K5$1ugDRpD;R+aHw%S%nI1%IKBz^uNFHeAgKHrK*HDPBjRXL4@Wx|DM|#Cw4)rx zUv`2(gE8D&j4={(+MQG_x^wwA7LSMo-J1 z(7c+;7{ee5jhL3DvKfdljHvJoFO=G4VmwBJhzj_ug}CQ|Ix;hH$$M798z9Lbc+rr9 z;nz&j4@jd=7t@TwZQlkNC3jt2dyC9Km-6r+buZB z5V?wrzpcGMZsP@Cx%3DZjsG$V`df}0aj(!0JIb$y5rE74+akbOs9Aub%q&tI_cFwYTt z4N^RAw`JvprfW9D1-sDVh#k&d94`(|;T84CkN z9}!-f@*1_-PE@YFz!F?EBYe*#l2;UD=tqiJ_mBk@&9F%1f1wg9y#`*wsHKmQKg4p- zYxLAI)xjcpGkr{@j?AUq9sb*i~P{Z*+u#;M4H3gJtVsKTz|sQzH8Brp}2 zA53)_naUGR1?C0|TA9ikEAkfYfGfnkT&&cmMWP?fCMpZo8|LHn6xo3gSTeuh;9xm} z<7}}8cBZ@q+Y|4oiXCQfw5PW}coS@8?otDFhyN`i6|i$7~j`DS2{KPPL!2*jRuMv1<5i4?1qR4rSo?0DwNED>C zX+<-3H{k1#16v*gGb*qIQNES)b?`%IStNjP3|8`rGSJ}h10nW`Uw_y0Ul5BOfPs2Ee#Mq;C&3>vK;~i=Po^ta3lkpvwMSlu`K#0 z94%ti4|9nJ;p?xmD<=q#2mr+d-WV@oLL4ySyO9JC&v7mjuXWuZWB_>$)z7Z`pA)0N z30TJRn_(V`!%dK^YG!gy!h5aHW`41pOH=*4>LLNuP%m{sh#{92LM*`&ATpaVds&#i zC|ES^==V`47%SU4P6c5UVLnj^EOht-CxwQ6P`g164OoR5P@Ij~j^G?)b;}VRE#i1e z0Q>$8;-17&<|Jr}kk2LNL)0C$la;*9Vw*r_J?B#bJ)jhQKg=&5yBGr&12jo53`wF9 zm;~_&X04Df#Jy|tWi+4uWn8pEycRd3#1XFr+5UB6T#gTe8;2MW$L#y4vj!Nu58^=} zu1MmnA&WTNWzoek8ETdAH^}6%O4PFAOu6tk;1_4iRA4D$@ zCvJ0N8E8NQM%0P_yTlHehr$;tC~+d~Qv&^gmP`w95H@cHU4lWL0-Zezggb8@GzFjN zPb3;cP^h20>2m0{HqHa5_D95s>t0D!{!_%z>uCV52frEB@{!1U>=H!7;Nnmy5UBk< z7w&z)CSgB9WN)n!ddcT2FXqzil>lE7)XNB&0Z6P6CoF>v<$*b;sd^-uexcfkgl7m& zh`tRP=3fT_n4%J$V_mrI4l`WaQ?%(x#A&ysr3LE>6l)dP;Wm2^_;Qp`#F`ZWsgoZ;sM_-Z{KTdepqQ7&WIXox zy^R1S2iQDn>2TRCwtE|ZP(fa??B&o}f=lomh@d+YN4p?|kV6ae%;38q(E{N)W*BDN z%X0d2Fu$70q14b){6k`h2O-GMGB%I+9aNLJ=eQ$*;|Dhsz{;`a%Qc4;cyh@ecEKV5 zOr9ZXjVn(G&H<>aM8}@D2m)hJB#<#nk6@92OnrjH{5MRS3H^86>R*rt2n=Pjf>Ojp z7%{X`IE-i%0@xs-7DenYjU2SX=w~C*->6AI%eqp)K-hvNO=tll-)cv!FJoKgr|U2U z$MF?nqa#;5u@c>Jkh39g!+uPASYZzG z&3(|*gHSC6Rvw|l_I8=}!#DPLwxsT-NX;$=_!?|HbhKzxxGdZdxn4!986F^>HWbOS zhyM zWbL4Z{+SW^u;=|$wePg;cp)lTE%CQ-2sWBxcSxf?mlO58@<^2lEi#J!C)kU#!+7ld z16lYTVpNCm1qTnVfdIm9Ln(yM5C{V51ue62&d4P!%ZFT_ovYR3o-hReT!t@^1aQT0 zFV_o^RO)|@W&J60ky;_@7-5+4%XPp441@B42?*Grp%jc7!B+Kk7RHMyjWIpxastKn zyrCUj;EsrVzTgnqCsQoT6Z9tmfXskNxxq_+h~<)w@Ku?FBI^=gP4KGS9RM6w!2l!j zjS85XHz6--(J3K|A@ zCkh6F>NKAes3a?Z<>DV7oNf$MvKsIX8nEIenC=0%o&YugS%RAx?$Z-=dFPN%RPxe) z*$3juQ#2iDg%REd`TtXe5kfRSR~YZXtihDNA7H@T@IprpOiJgpX%Df~g+Y=3ZG8zC z7Zj@aU#~r(Ajof)0Zmmdh?IYTy8m+QjBIlhmZZ>20QjFsder>`xyXZ8DgtUpgMZy- zB{j*yzixw|M!1^%f8f^7AHEqyFL1Y6Rw77K8K9aAvv)!Dgb91T461787oeV?4m_(t z1B@-MCRKTTG4o57?y^&Zp3TE)KKI6bY)VTfxARkAfUt2BjEh*yhu9Mk@qjAV@!`Gi z$a&PeR-WT55`iiF`CP>HxYXPz>=!$RJZ~O&M!WT7??G_`2_O-Fh#wi_!ek^i0_Fz9lJ>AH#689x zGB>^jL<{(MA}mRg4djx!13XcfF9+5kkW>nB(K)H&OW?#bAFxjPvNLcn5y9 z`S%JnNP!BiSlJ^<$WsVgTETLcA(AhFiWLl^*MOAZq6kj)*P@g#zgmGQaltV+xUq%1 zSON@6(KM2|jfyNs0Jv*CKZgLTBbH$@)KTM;BbR^{z-1L^%D7>o%nuFM%B=}~vK(cQ zCZl<=5Rxg2(INMJnEn0(STqt=E~nKJbH2o+4|XOd!rO91XGe-=t^o72dQo86QU4M^Uoqm2f)GI%hB)V^lL6P%g}*`LyaM=4EE^vw8UGP@y8<=OgZOv# zx}a(P$93m_5vuyBqWwE>Ufw@IpWpJ&D{s$MTfZiqI0?801Fzq?DuEP?@v2BNSTj(y z-J?N_D$rs}YX$I>NF=t*V;l>h|NIN+)2im&CQv8Q2$fe~>s zZ=a69y9VgB%d_a^OT<2dg3>A+jb{dNw(}3_O8@I{G{o1rwCMYBxB(7KO~6xUJU@Wkk3rJmMd?o89CA?o zx`Z(ICac{=d|(=0s{Jire}`3TBksRYlUR+o|5L=U%m6VQG^C(H6c^zzVv8ZFOxO#9 z+mT3U!NZXM4`3PRfVdL?(@%|H;~<6vBIwmR-*_D?L(qQ7W&H>*LOoG_wR|rGx?5NZ z22d=xUH#uKP51yP8dg9NlLYR^Z|@ajf@a|wAGT2pyQCrZEyJ3tyg#gbY`s8mS7GI~ zJ)3)yvc@tF4%>2-V|~IrvwPnWX?=6C=9-G?rx3MUBCSmyV@fa}}B$WlJbhcl=X$1!vCBUEALvYY5WKg>1x8um5&&S|QU2sr$I;2Y8 zdOg+z4vKpPe|8PRLFPgqm!iZh1XY9W!Jox5@#Q(Rapg-!T0m!m$VMJ;*Xfi_Pb>y8&@Zx-^5HQqO`Z@K88V)}6LOjp`2H}nT0%43aN zLsP-l>iPW^QrmgvrTkiyXs@@(fPN|!Vlc9x4ja~B=G&t5B)UE%uA&W5pF4?Nd%oZ$G2s96p)}lAB4Ry9b4f=d&@P)*gi8D<2-skArD{Se@KD$BP^BYPNN=^9;?`k77tzy#zR|nRFen|kK-{T+lH3dS z{@K8?AvlPO8oc#wt88iY{U{P8IJ$ZZ$Ck0T;k|bQ@8)KbH23Y9OR!zj?{feyB(FF? zIF``n<{4_B6TT5v}1&G{(Wg(iE;)Ab_YT}+tA2as15uwN_7lhy%SXdNC( zmi@o;P`qnIM})cge$*!6SiLLnFGuOG@2QU3#O4;Y>0-m%bzPs|-jNO2{ft(8+eP9t z+hQo1&GqIIWZOjDqDW#WhL(SP-oow{<*K-K8aaEDFbT+>K-}k#4WO0J?mAEVSoF>L z^vdVG1?;Y6=qKZZQ`vKUt-ySHV#vhrJ)Z%e#kFrvnVH^| zOOd$A(3#I6^PdB90a~0Zlc6)eMCN}mr%iaLtC;& zJ{+wWUgmw?0*>M5xzUA`L1En)&fC>G-&!vR#dTz0A2?o;(CiN?JLh;15w@@6b)5#Q z8F+}yZh5**1e~W(6e7%w)E9_zkRLOMaJ9}S=#&NAb-e%n+kvbe(p5p4Pmq0NHUg9c z$XztyoAcI{j28i+PZ1=UhUx-_LK69%h|0VSIIxAmOA(L^BjSjXgfW2w7I8ZV6iAdh z29UJ4t&lhg$C^w+{o2;8jwnV(Fp!ct&7plz@*mm))%om(3iw?--O!tB)sYQVT2W5R z(~l5c0m@-n3Ers}o(OidVN}UQZy*#b#`{2K4_qpu72$hm;40c<39BA1?+%Df6y(G8 z8?fP?#w4k;W`|G_6BEH!_cq@r_4;`WdPVR=oUA#-k3`YhAzaQOfpdT@{o!QcUy^f0 zzBJtwrsc;lG&(*Akx_m`xYA6acI;-@an zq8w&WifMA@ZWaq?2NxQE#{x6X(wZg{U>kn zQeF$2zn2_#Jn(s&?za*7FFe}Mr4D{2beS{C$&tFdHTUlEHY>6%UL{x&>T@%6#jk>E zJ5H%($H(g)z4yf`$C{+iXUEk#%Hh)V%F8dur&+!V64h*9ymjc6?xflF9`IK!9-vu3 z{uAD2@k#t?#5o4BrQ5a^DVY}w;(ru3wW!zc``_Q#*Dt1)5@Z4 z`PP3s8etwib=o z6?LDPpRTTH`gkU>@pjI)g+uixDkjdW1-qT8L8GM_tXb}aXmLyWGcM}ZQpo7=07F6`(A^KiZe53$3Ue&5cw zVd5to?Gi6#zMrhA(V1+#b#(NoN9XYF@kz7WHVm)TxGk67y;J8h3L_bsvk51xqfk%^ z>l;ma?8RVsj2v5B8M*)4q*%(SZ;TpYQcl%B2fanZ%fe16Pf zRKOC8x$xuD(}|&;YKtzVJTD<-OjG!bYQ^FKh41;e@6%TvN@q>@n#U=O=wUTjwMj~i1 z!A25j9DQJ_1$}1TguRafyJHGo58jq(ikFr0P?c2L8R+S*>_Zx|yn=L~ zRsJQl=-a!7E#!M@?%G->V@M9Fdp>1udvwBKpm;-(13N>eAPxQI0PZ}JJ7vMGg9)Ec znWfDP(A&GX30E9Bz{~J%%M-)KM7fA}beR*X=7}Wywdxzi*0H-iGCaTex{3Vo9rK$) zmiiadbb><-xu)8>8$4UL9Pi>WKcl|$>c^C&^*s%i17BVm6?2Kysty!Xq)@_%w7MUs z3)nS|s*rVOMt@7=p4$77vRoxirQl}XL%S;n<3Druc=;93kgM)a<9%+jJFkk%voZ9X zfaj&Bpz-3Iz_w#tMls@T2iwbR5PG! zt0?Glk-IJ%(*~(v7dz<6FuQvQKJf;`Y@Of<`z&~J9(Dz}S{X+KDO+{S_Vm8)?mk@M z)qK9qgNtidsC(P_wl0H#nf|Y!V}Ns4s9qCjya$b!4WJRwBxH9bH)yN8q~WU($yY&J zxq}tc52&yUSG|bLCuh9EF02p+8l{&(&m&tmdCzh%DE#0qb*>l_^OTF$;dFAYtj>v` zK?WLM5%bmI{6@3GH8fGvbUfi1$*9VJ`NDz1h4%H=r6&>H_)(# zjXKbH2pbJ!`tIqG)8}bSRc=VUcQ+QPW8Sqh!|mmL!X}9qOxn|=uiRTjB-xp6lRUUj z*aEuRVb?mY$LyTWu&WJH&48}GqJZi??COA2ulE)dCcI~WklR4>fYyOPh(zl?gYy#%O4wGwkOpiRh!hUpWk9H;9 zYTUH7U4p_iag=Os+}oWgeUJe7l@3K{do@^X#ZqaLB0yTjb;K*J0)N@_qu3N#3- zL4z7JWIiu;L|f=4&Pd+a?a5sm+$eUgeZep3+AfT|QU2}%H^LG?XmAh^7HW?c&K=Xp zR6d@a*=TQZd|_63A(=F;ExwXoG*3*-mL*rLtwoyUllzA~4+JK%mC8rF$mhzKunJxk zwKVxcajDIQiYeK(>|#?L>vhBeeX=LddP{5u#zbYfQwAgKK*+kN&cWMMP0o?Cjbrra zqo5~4<-)nmtYXsDyZ1WO?B{jPZPpmtJy|Q)UrhhK_>5?i#%7%(Tc^_Jb;inxIrDDB zkDlFpI5#GJ-{aIz*F{q$59e4M+8H~0qk2eThNo2E)A$S#oAn#}I{iK_-2>L zZnt|-@YFGfE_JD1vFvWq;neNd=d2&TRxYizymz8RzGD}I9$5h&tH{ew%sgx>YaS*5kF>+PBsUNp1tS1Spw!G<#Yu7E)4~9ZQ5^rliJ#lB%#=u z^KL8Aq4cUBVuihNvQ7L#jtz?U!~|buOcqw`b^5;3B7WOqh5e36i*!O)=RUcQVOBaz zS&knahl&<@M0uN}PdT0_oNsA4qEQ@6N)}H`A>FcIJYCf|x-dE9D@<_a>iRs-5<-%j zSJ!_4-+|vsDo&H?EcN#E1=_yqohY^6Zz*i6Mqr{sj7@CsDcE^EJSnJZ=K6H2%TQVe z&2)C1EtbGxFu;gd&sNeZ)}Oz*dbUEIfO0w_Q#|WUZCL;9p{Vd&$2s$vxN%C0k*ssd zsb;b)Zpk`WdDAIxFxgsG~+~e ze_stHcbJ%+MuuT&N~U|r$DyXKsWT~a;blgYONQkd8S+O?KanywY${C|N$kBgS#Q7T z_AZSQN5`IbUppGhG$h`6=GF9%2)cFWzBc~wGL4DNVH(XEvr>3KHK}y6ov3#>oQbzD_Wp;%^(`k)YJXMP z(lYxB zJ@e}ud-Bh)n9AyVvK+g?M8s~4es8^re)k!m-(`Bpw?|~d?o+qwB+2AnaQgj7@Obg) zF?YAW0ax_oHGdUm9%ZxVFRxpzt65CIYka_zJyPa3t811UgbKWL=v0*!?S|49lJ<;4D0jIPc_x&E8F`#Ub7lceyuT2y?v2H=e%N8?-)m+jM&qV((P8JAq2T1XKCfIw#U`$}zDM7c=YmHEg{GDL zg0Fp;542?)P8D{48EcivcZy}7o0mglfztlk z-2V=F>3$F4lb!q5vxb}@v!N~pk7Pnv#xDAYY<%*T?-T`xyr8S;3zO-02BFew8G|Rw z=W7~7?!5x(ivO#5JvY_-;cwBoO}?A5%nz&HGgQmuJ*J*f^h2|%=!bPFb;R8o>WGdM z0}OGHKE|8!74NZ2VSwN%AkYE?mjS`9JrNy~dVoM16M9KhgMR64h1JdvVwJIHS^aM- zaTnNJq>@_Dxbb>+GbN9Hmbwh8pG)Wvy>si z-=!|)^rTD)xi6;4S;_Np4TZ!s3|_XB9qBi?ZOb2H+$4B_{Zoya$fI}3UyWD=p3udM zH=Ag7Mw7WN{jkh0YdX86oN=HO%RWu)N|;Y9&YGo4sm(wc~P!YZ06Fp(oPr*M|6MUB>~g>LcX z6UJzgB?&jJac`lUM0dA5-Hv^TJ)~h5nn^$O>PHyEx0VVgYnpL5c@0b$m zb$edql%`}qTF4OAiXXLMaT<8?(4Wz&azZqmCG2VaO>aW?av#<60hPp#n?7_g%YeVr zx;6ezy4}W8s-n)`=}Yue0bT{2cA}c`1hvY>?75`sF##7b$&;Hado&f@r>G)C?(0>i zdM2?Ux}#>o%e=xXo<4@q?4k8&^AGEG;rBJxlab=N zB{V{{@r`ONOEwq1boq_s2Ii`7PWB~PPAm5JWzWwt-T1s+{^Nen$m)90x9jSsH9qS4 zWV(%M$5BmxJF$p8G~?--PGBN-R7f&4y3EL8*eFswOZ9tvOmw2w*5d|?t#*#ypPIBD zrmL|Jji+d7&ps`yOe<0Us9i(d(B41rewao2eFAw}ZiAXn;^@1Yx#u~i$`^A5pXqK( z8=x=78m1BU>1V_Q*JL*it5)>QdI{Y;dSR~3^MrU9F1fPA5-65c&^B?zz|(C-TIbyuD^xdTGX`Xk>gXR@z%nLAww*g zN4<8JWlZsSDDx%{S%Cp}TIo7;$m2_a)IfsRQf2D3BAT6YY&N{4R9jy>aW+^>gnUPHOO* zk&-;&;mX_7LB@mKC!l*Lhbun4-E4B};*Y*fxuw;fw&Wf&Ldx7TXQn2(&Fiv8nTH2y zoT!CcQk&a%#Lt&~MjxZN1KfWntTO_s3uDYW9GoN6+p3`oJ#%T)z_C9hMoh`@R6E_&R%WS>k zO}9>Co^ic(^F88(JS$BJ=N&m4$_6~8c8EBi_jyin><(ig@k^&?6he0r=e84KKCkB^ z4ba|lh=p*o#4EXTeTM?XxA+QL9^bJsvTpse&cl0o#JAKPKX;$5#FtbyaRb$Pw`X6q z*j$PCnh)HeCImfu$OxEk-GSubZ)JH-AymRB$m=jS9pWaZMd-D|=S|xwzO1KSPa`v` z1un$vc4Uq`ADf(rqc*;&@lstRSFp5+J>x-Iw7Scyc%wc7t@c5_{&Re->q1ip*Izsu7Y-PW2Db0k`0ZEUBjLjK zr7ou>3zi|pO{V=`0?)IAMTFx&`JL#v!ntR3_F&Z3In^vXMFG)QkM1>)9f_C;a!+mN z-x8WIFGbl&Hxu-1PfD8P#~3w-{Ace?jfoyB*vfs#YUt{3+4i*=kWU4<+oY5$S5v;s z-lr!u$hmXefHEXjj?`Z6Gp0d>sk??N)j1gN8BL8GGR~4rLDeJh+>Z8lZ?1keYrme` z;GtI+KNa+>>urTY3VBt6#vtd3a{Z7+1J-b@+y)irplZJPnzNDx4k>9HIiqh*#XNPt zw`gEYbmeU0fU?le9rHEKWN)9O*2h~iQBTEy#R%R^2JZ-G9Hvg)r$=;i+^$g}$M33n z1jovT!HCsw@j;1mjc%;!O$Yl+>UunN7{gupEC_LzF`k7+(P5eD{$H4O#ifKS` zIWk>7Yp{g9&>m1J9k7lXv1@!lci}s0v*p!dgrc4od1iUql)>?I-UjC$Syv?k?*l{R z94GDDcPM=&<2cDVx|zekBQQM3`tGij8CizT2;ZLK4R6kWXN|j{1So3{z{&ap6z|V} zu(&@rvxU)z^ltiDg|HdxJBs%s3Q<~7dd)y*(N0Ds54q!`GBM!rY6IKXt9vvy&ew3& z^>it)Td8Ge3~E2lroCQe+s(~z<1w*9Ige-a;g;ca|Nb%&17nX%6QQ#XDgXEffthLa)k=Un}kL`P%fYqh|3?RvPn_LiM>$&dg#5dPj%M3Fciw z#r&LRVY5*uhxl?Y*~JALfAbWYHh54xsyj{KKl-KdY<9<3#Y}^Jc1NL%MhM@##MYQz z#X+;2Q7m>ZQFvdy&X2mpFX;{u;i)loDNW&j|a~@?4{tg9`OI z#(Qbx0nS{Ht{VILRV6EReNrGLn#)U$3qf{x2txf<&oq(C~5s8z+ zq0(lmeG$R$Wn}s#Gy_g2@k^Ed*vCUgwtzqEq8R?LUfeK`ACzI(cf@H`g*1Bha&^~8 zRPsBx>d1^D3W7$`x23u?{z%v-Jmk#T#&_%nkx!{>b;5j)YfcT zr7bSnJHGhL-L(~Z+7Z&&SI)}MVRdtetJtsBll!1r<}{(^$I6akGDgSomW*i)@r8?- z{1=CJRyA#W`6;M+r0hi#foh1MSy=Nf?p@TC`Hh2%hOfV?+ztum%D}!eVp1H6Je%8G zJG4mEI8AcguByPMgR3BWvttWmPD$COn4(WQtwz%6!QSas&D>3%XF0HWMAJH)M%L-m z1vTXvccXY`b7>1cQSJ{LE{q8PO%( z_v}`Be8bq5L5o25srDeB0|x$c)J@pYEu*KJ^NwZSu3I$i;k2aLvQ%S6YqXR;Eu6ue zFuN-|XsV!dKsHOuu;-+ujl#+GLfpya9>$J1kEH}4w6lIhU>U?4>cCm)K9s6Nz<+Ej=WqM^On&?nFM5u10u#5y#6gLm9)BJ z97BxV1L?4rziwv&5KTJ?@^YJd-|h@8oFhFt=!Ew1fcjWXOzV z(TMErJ#B8ix5p09=_Ea@SfJV3bb0Ua(R>2IH{Pw)3%&;#t$*oAqq16OBFXvd%d5}AB?I!K3e@_ zNW`H!LyVk%j_)yux5-gpU8&A2!?u}6q=gMZ= zzi_Zrc;R5>=Anlf%8#N9t(RUbBwH?xeYwDMak@U?R+hdsp?Pd`jQb|Tfh{?y54(?nsf?KAH0K6+AK+nK%mq=_vy z-ecc23OcWW&bbYo=5tG1tiPsZP|IV6hik2-4Q-S>!`3%*7TXhV4;@@u8jY|ub+gr< zR<7v|i|KK6-aBNwD>JvqA)2Ie@ht!Pvt2P+OXn+35T<>zjL1>>-u$jy(#oSVzISMM zjK1CEu$gJUl2_)yn66~v71d|v#XmChzDFNUb#{%3@4xjdEjh;I%H~gYQ?>)^_^Moq zTc_*R50G!8`!GC2s-C{>>N;$6|D>yGiBv zcPKOWwX%BG2f4cLqy;11r|}x)%(<7sitgx=_(eP^GaF6&Qpn%3`BhTLI|mbnqnD4? z=4kPp&~W$2TF{~GqnvEp|FH1{&+N5biW(StmvaW`KHBL$#7<{;HSt>ufE7E+g(>+Sd=*sRziH6*PSK9X!MYLTGX@B4~IPf8x zoKHQzb-b?p%06s9j+Q^~L0uH3q6|P*?BnNif z=@t+Ew29w&Dx=l#*%s=PcTRqeaA$hPetUv+@}QfH?{kiLX_B3UUa$MBBsLPfZ~wt) zw*I2qOVD?Jo#!(*!js1pCwdwCREQs>i}VsJgwZpRQY+R*yAf`@Q&=U@N$?WsqgcQD z1Q>DWHPvT{BMG!ji9Y3Y;p;^t_a1p|bR4{Xoo9qw$)%SQJl?I;~3(xb3dGu7>eg6xbIy z2niQ(5NCfd9!sPR_ivIDvvLPNAT{e6>gOxe?(E-dPc8&CQwV zL=?A78MpTwpt@zclUPl3&-Y#GQ&&y2_H1uRAlyV5bY}C-ON0br+qrHmUHvgu`pkQq zR;&LBI?A@s9sYT0a@XZIqckqg+sgOf)J;t!@ed(l|;fS5Y z(ty@*>33GU@l$3m&iTO`y#`uc^2sbUW9 zMqlC0!PFgRUuVi!V=vhEOmR6rRtjs<4N~^3H#TBzTLk~khVD?-1EXsDnT-~MqUp3Z z%rq2prb&i|u`zSqVll4sdi`G<-wwqX+*UhN+o)i~r(cv@-(i{iiNVtNVD@X#EDKv7 zj@--7`?7X78XSur&K2v=YFV_OKl`l3nNIuG>(Ls;I-|bL!|xQeHNM37e(dSXS}K_C zakQRno9HWB?27r+Kg0Z~rQ##ErN-ONVZS-sN3(_BoP!ob{Bpw{X$bQhm$tCZZULPV zZ9xkg{2U*G&e0pCVl1;hhsHgNZ8&FrWR^NUF0@}(lv~pA!?GO4dT54B%!z3&jGy6J zZ?8jpqKAghwONCygp{ri@E8nqn&}kFdeaqoH>p| zCWbCEW1uc2Nhdf_hdY?gR>^XJ*K(jMNvE>RTcpT48_amQK2e%GJUKqRBDe}eXA8)a zlXQIkh`hKiF}U1YghObGN@&WgK2i5tF}+T)1DDVgm|J(CuJT%OP9WVphHf6bEG+o4&6z z^)2__z#&9TB}8miZ>o8%c)d>X2`(YxHvj&J-V#OL1z;6d>P=! z{f`F{5<%Y{A^Lxz)qA#h zAlAD(+Z#jYV_rX6SLR)ep_4bOAN^3~&H8V*ZgE&oshf;nH+k=^c9$m7&?MrP#yf>~ zAHB%NIP_0-$|sP0B#}ALschy~684PcAp_6(l6V%D2V!~BJYvrxd^Jj?m>iuknhx(z zGUoc-mt5LNp0{wvUEEV4aY~4B=xSeH;m5{JIdLiPX zuHPN9zU_xe&*?rO2<$se%=r8hC~6$@lqiYJ3!vFV;?@Q*%dX{*RDU|Fh0;40|zf|a#dcbz6 zbZ3S__%R>^ptGO3$Qw{z)KjuVhNsFLiIGIQB=gF=k--RE<)&YBM!c^>-&hac$h0+M z;GtQBCIyv{K@%IpR;{*YAeCV0D$7ERV)oM95IQsjWuVk{y0FLxE@Oz~d{( zPU2r9FR)d63MZ}$OaZ5J4$Rg{>Pxfl*)xlX62?m@%w`cE7&{H%ZX@2mjX(}C33N(Q zBpDxmJbd`j;7eqR26Ph*yx>sHo%E$+X-}nj}9&murfub%*(llpc*nmGVe8dFvw|P(9YwG zT~baG$BhE+ID;Lyp$o$uD30Wp<5t+{aPFqV`3l_r4Umo53)RBzBhnL@RwY2(Y!mmo*9^djQwM*Glbn+ zv^hJKlOB|W`5N$uwTAm@9QcabjpI>(h#uGqrXAf|4pNM9?0Z}i*1Gp01L0d>XpRFz zb4SymOss728!#M36d#Xk=32Zs9(l}PLPj;SopGJTZZ}`KyFhg537EwZd5#o^BG~Dt z1;kB3^A;-kF6i!Mku%3opt`vmQ7t(PBKQiZ+W0|XwFoGO+VD*p1GV_o=Qjh$@EZ^G zlsu5G6~#vALbv^*Q_3k3UlGmfq0+JO;J5*g6A|-!zGe}}DS$2$qatTbh?58$pXb>d z?DkZ|MIbAll%+x_E4&xMbMHWdn0cPMPp#KBiU)5n^9S72a zKh@#2y67Zc=0)Ik=R4c_O<UpsDvjf>A37G6C5eI3Rr=pS?J@9QwD zj|~S2z7B`u+y^D1pc}UWHq!#zyOH9p5ryDJWC8(~|EUfuNsp^b;~TaW7uKo@tS@eY zRz{v*cn!9{--+tZKz3_)MeA{)sU1cEIeA`R9DAjD5A(~G#8cb^Iv%L$u(uur5Ue18 z$lE-=K?(#7W@kF(M|OTB`EaEq{wnhWF~%A+;yC{j5bbxKbvnImHc%Ku7LwE-NiMN< zD$5=LHs}P87^xnxK~BKDtj}8ra15A_-M4<X}hz+L;6$r-J4HYRTYn zB4WNBx=XfSnR=Y9R(v~q=&_o#Aq-Xe1CJn1I6e|?n6j?sEovj=Q5$g|wGoB}$WF3f zOTjp6$if1dSos?`oxkLqap6=>g81rpoA14Y7^Ml zDMiGl*TiN1= zE!B6n4R>j-jePMsq-hiYLWl;S;~aSl$CE$^aTbIS&LD)qfDob!h7imT8QfFQTt)mf z$WJ`Q9U{+>&yt@8Imx5lV;nXzo$~HS9x^1HD~S)#12*U`utA@J4cY+A3xV_O0W90J ziX4G#x&qGzr^Ro$Y{hi&zT3L5mubbhc7XWMnh-;Xh7w!RP~sjEN>rgK3>g!matBby ze;y6PuAnIlFPg%5p>_vG;57*PXehBA4J9PdP(l(>x%1kH|9ycv z{SJK>*PJvnp4kHbMlo5ga%h@d{0CUgJ`m z8pMRET?S#xUvkdNI?NX_E4n5hUK>l}{P0>G{vSAJoDQ2)jo+pEQym7t5uWG$A2?^6 z4sWUHX07>s9R>gx#9aP_V~}J)?Axb((m|avsVcAND2$iL*(i<=wM}N_ksNm#2cq~=V{x-X# z=E(gx=YG0seF~+viCY(|*;HKT_E(N7($@+_RkOXx*B^cvrI5Py=CJiqukdM<@?x6- z^+~Q1XChAT`l3(4)%Mm3jLURMwaR)dRi$W>t#iyPpZ&>{w*mFFn9oz*%GGS|w#HeV zj#jwjTHUO0CgR4fhUQW53gx^>@7^O@V@z%zd#xW3D{fyiIujRxTMY8j3$C}QH_4?x zmU>_drW+tb$8j%@YY;-lH43SpiTJ^u-pu<{N^93yTj`@-Ns4;5#WDI6YMXwwkC@im z#kZ(k6$M1-YL1jCJ8=E9f;g6s6ETT@bY+*U^-{w1twhalyfQ zf7>)SHQ(%fyX4~*lE$M8ONBNpjv7b)Kla`{o~rKq12-lqO5`a*0~tc8P=w}Wj8GX1 zmCO+tuCY>jM9EypETJfuWJ(f3MHw!x%qnEO#(RJJ>_cw4s^|Cpyk5UQe*N*RbIv|{ zueJ7C@Acm6+|Q>n8=CxNdKsU8?n8V3jf``ya^^MPCOJ0Un!>z`uju#gTJB1URtU%! zQ@KAr{pdhZzro!-gM<{aburO|B8R?&+5J? z&Pmqy?5?zD?A?mQKe&bY1?u+_==biWFsY3;Xi^!XVNwsZ!lX*Gp-DXslR9dMCg%{E z9Bw2zIWePl$msMfX#@cF=MoYiENYZnZGyX1ehATS1V6+2)(PnP2sF77Xmb1P(BxL5 z$*o3{dyg!+Nqcwsdh+Qi$GjFwG`*v@7fl)8Y|2z&$`bL>eg-j3&UO$#c?!u0C?-WQ z5P8nwDiA;fQp|m%+Y_)(cTBY`kXqA3P zH~BW^N`EHD(GzvYawt?xE(bYBK>f!NYY&07dOnmf^k*3Z7OBpaKdO8b9G}BwO0*rx zP0Z3zGZW+pwJV@(v*~vDifbNDIGS}CGRAD>e`k#UQ29MQkikYYOWJa7lGD&!*81oH zrW8@e$ff%wV^EIiFX>ctY{10&owO^LQj81o-&EK3GVkz%p?H>X3BVvpfI*&^0|p62 z7^Ds`$VyYdAhm!&x)26=2pA+`1z-?Oz#x^;fI*HT46+|ENI1eE`v8ORD--jit^m4P zh0xU^Kv&Be0A0}lx?<)XpB$ZH?AIBhdKPl<-6sDmtK36|b@yx-Ir>wb7^9_ed{0VR zK!Wu>r5B@&A%HT*7L+kcPQeP}z6R->`#PlaJ~g!BjnInsLMwi)FG}Z9fR=l2Hb5RA z9D?jncmLi@rAb~d(Tj$J^Zmp@X~?;doH0`NI`2Yhy&9!;v|i4sqO|U?3m#7}x$#SY z*&yp3zUz~t;*ZXjLGV11cfBF&>TBQs4!StOpMo4~y*a~R=gmxg7Q5ilflq+EiiydC zCs}_DI#~;y>^uS{r+PYP04Dk~n9dw*)1d=n(mxz*vo+)V`=boj!K2HdDo*@4OlJr9YG78=s9ddVf!* zh<-yxU@d(KuojH=3QmmVMfy{(@WVE~pZPOnYBk7Z(D4g4-NT+5f3%&oW_#JOb@vW_ zVnus}nacl7uRtMEpplwkQ|+~W{kxu#(dk^)vN?b`QM3UYW~Ib@zlka3Mrwvmb6QG* z3lH>3~7bvH}J_pyAQk4(Mt%((s%Ebj1khO3J;xA2+n= zxm5*i_vtkUBIR52Mz}prIlSW2eV+4~?^>UE@LO&#kYFdqK3Okt@uv}olBpGJkZ3G4cWolex}lzHgY>$r__%0 z(~~m>sQezJp-OI{(B;^%H};?n6_VWFoPe`Ev&h8Qj)vSr2}sY}6aEA?V*T%tor`5* zdtlRsiPS>c>rvkcxb<8Obh6GoM1({fVis^)#|eD9-XzY?uMW>b1iVKty%#2Y`LN+ z1p_=&`E&gj#a`i;Y-(^(ChyA+z3KO?wd(_Ov!7myzwcE48=dxh@)#`Q$ZhirJvg3b z;7XjX1)>Y@Hr;_IO-|R6CccoSM!WJ!#I#7)Nt~+NM6Ve5n|?~L0RnDoYBW4vd`eI3 zqPeo_{82IbC8rE(%slogW+Y;1u6z^uoGX97_;}4BkG=n_8aWa5D2ZdFjirLS_|XfF zuZL)h6w5ds)(>*=j(P3~CwkY9$c0%{DNY**n@JE^GKSo?>qK(&=4*X4C-R&jkj`bw ziRHVcJY+0j32;x~r+)5Fyr?9}cuAb`(gS9U?Ps|i@cuk&!3~_j4l~wo#;o6JHo6BV z0Sy~lN;kG7DNu!&of6Yk$Yjj)$rH#cT4c$^8ohc&Ft~Zz6U^9J(Z7J!V1 zb*}#Q9(b@m|2*)ZScXYi(H=-Sd#M1!h12cVl3#1Ta;AxS&0>^pXW@L9!!= z0PDBU&2GsYh5_!i{M2bcQNu=e?YcZf(FdR?obKDn`qZx}U`y99g+O2E*#aG)uVDi5 zQW7XK193P86?NuOYw~y~(KOFZlbU!iGtG*%Kv6y?odEo=9HIwiEhDJ=m1!;&cbb_f z(==CXYspohO3QUY!j?11d=j%5Y}o4iwB5#LqwhAlbL`GDRHl)Av#litcw_))dpj<2 z+0NK<sR_a?CJdblTy8`YvDb8RIQPlgV~>nHTCakOfk&&y z?nFZ@O>xDpMDXWHi;JAp3RUQRI4`Od%F_EVj6`|rEn$=FiSpdNnyNm5NFmNUvDu`#rA_cGp5PC99i*tBk!%u#x>|pTo|38?ivuZ z>Ec9jwhtEpnh_?oc8It7=X+zZ2OpBD}a_F+V{N~w^IT&NDC z+xULfmUR|gk)g_pGb^4CFrZ!G< zKM}kP{#}dX868&u5Hfn8?1gdw$`L5Xp`1qK${Db5r=XGC$QueEb9Vv(&fQ5Ur=XlJ zMbbU&b{@%L-@J57(;$IhJp&V}i`Up8i)ia8Lqm&%nQ7$&V6<{u+L8oy%0e`H&m+>E28!1NSpOW9HiTE zrAn-b;ogQygP{}zv!MsYO(uIFys0S%tGBK-4RZ+K22NP3&;#`T9pLAmXMl@31B)6kJCA_iH4Ch z#abq6g`)I6CBrkM=JBM1yMtk}slPB;=#)$>$47HVgd5DApmc`P1xgH*u28xmk`8c* z2jBakL&;CWAnAD+N~U=h&uExPj>a#PIPRb&jtNo%V2z+Ib>j}*0**9O1k=QA$(?va z%hXwn*5PzPHajI2d_||INmhr;dvdZboTshE?e6pbpx(T$AZw3h~c` zs6~)GV;rs~Zi5s(!xa;Yjgd+sQqS2%>IVfZ4>=Co<@}UF99h7@33l)i((g>pAF$kq zh~X*t4qSwy63!si{Cx=7<&2K8b1(|jXPIi>+u|W zr0Q`xSv=7&n5NhW9I)KnF-}9C_h5k z3FRmvm8sA}#qkMwR#m2veN;lJLWK8Fs*vD4lo3=&sAOnaO_8*%OhAe(z#WljM~569 z;$*z{V?ZEVU4KHabQt#&C`X8zLsm$JQ-93F53xmz{-FIfNmb{C5)Ek40O)ok>$^jK zbc_En^ zs|R#*pn1qYGqSD*nM7VT2szHu8|6xxaRfAS;26Lj)fnvTqKycXGqk{;UUGXS@_-!qwIK1a?5iCjcxLMf34@1c~)hxbs@ zfC?-Cdx-f!7BbkgZJBM^VB$3eOYzKS!H*97R2NA1M%jU#9BMNy8njQb7Ri$J zL$x7V(eHrfeWsH{5DWC!a``4pUjjNW$iVy?>KlBmg8(9CpBCqd}U9dZwAuO_tP)t(oq&E5q z@JsGn7#X=FEwKW4GR^A_e?^#NNg^yuoH-tUB2R>M$Y%bOP6!fP{GQ~Qqmj%3gmNes z!93swZRw&BT5UK--joXO7uCjSEBg@X`40(L$mJnD|I$@zjgP#RPQ1(DM4&_SNdYqjhjaJZ2f%6C{lrPRR z9hmOI9oP)3QA$#$6Y0UY?EfZ7vp-}2_Wp?}5lUXT9h~9e zKIwBary#il3m3tBly>UM&zykJKE=W#OV&?JUFog4_g}`brE$Gog!lGp9)&bMoc3yk zSjDI;J#YwOseQu1At((F!3SPTCN4&09c5r27LvCK2ZvySM=L)#1P^&!(An;v*%)(7 zD+f<&s`w8}&y^iI`p9n!;ZWkBbR!P-nY0UC+7PV=7=H)DC)A-!WS;VF>&&yfZrm?`wS7J>55|$c9*%&{&zL3Xb9mjt_X&cM1;H@OPBT9Ew0*Y%0|Vzq4s* zv*Y=ILE{L1RSWfqH$&}7%4GqL(Qr-Goh}K%y{lA*BXF@Y;juDU1xNd7ttM-r65L8C zI9dh_n%^F5zCHM! zzoR%eyhdyje66pfuHO**Jmlv&8#|sV`}kJ{+^LliOyd_!vryMpR@cYHJ`an1o~ht? zv43FX#&d--v+z6G6z4ouSaI9w_TWeUj*5*PDavKx3S~OscO(PuU?l{t_yw&j)SDY6 z(NjzXDp_#KCUI|K>AetyAzpreWK zX@d6gkK;UG+rtsDE>9H3w*xUZ+!uS~ z6-cay!`G2vqxHye)M5|Wf@4ub*CZ4a=y!SW3ns~LdMk54-9shH@n$T|J^7)H$av?8 z+e_?dDylcKchiM+DG0q~+^%}(Sk%gM5nus>+T!8s`p6j6k&1u7DH;IY+Fn7`ZRA5% z#Uk2};g#oZBg&N3)jgP_mUqt^Qi*bwOfpbW0&gqXDK1ipQaB>?mYR(Q^IZ=*G-JPS zcb@AlNyHWHIZNa--1kPQ0`=rWGaHAVKC{vvIV47L18e2iz1;*uwD6u(q9$c^-FRU< z$sC}#Rb(SGUXz7tSFn0H+njwQyp$&{5T2o%PcIp(N3hUM3=wEB*7y17ZiYKqe@jN6;+~jn${v^Ao(xOc*%9cli$x?K$ zhYByt6n*Bq)vwIE!w|$m_BpG3S{^&99{{B4=f(0j;FbI=n0wI zoq`ZSwh%#^AcCrHLj>_d$f-ieMMKCbf!rZU8vdRnJCwV?TVWJrWZ{}01*$9Zk@LaU zl%p_x;WUDm)VB+#Zs8o+p`-=UmA&^T!2TMJsHd2r2XaoKh+98xfNF_{ELrhUc5jBQ z<~cxVt4Li@fOhtslkp*Q_J30Y^J7XgLsJ)c-x@%g5?KdnD!+@SL}Yi?H%@lQQ}`T@ zHhXT}F;QwR$)T1P#KlsU9feoU%90Tk&ArKxlh(E?00TI-h&}SXif~a8q^L`fqIeOC z^1X%(?}HQ-0*3|mMzL&R@0N)s-=FF&h@cG+K?)E-K@dUPA!#{6$gPC*b9RO^qJw9+ zM&TWmuAq8Y-a(YTNsXL z4fKU;PrswQfj{Dm?mU)So@?_RptM!WJnB&yS0i3L7r=!nnPN;=c0V@~;SRl1OY1?L z$d%{OJ;&(L77x&~n?uU7r|=3s(Y@^|cx+zAg#}=8U~I_>W#AY+RA3{_A}TZF(RPqq zH_Ok%7AM8l-B?oN8Gb`8YUOKMHxG;Lkc*fRE_$^Op(tudQTyRAD;$Q*wFeBlC&_oM zupm209DN{yxFCWQAc8U=X(gbf6#yY803oM=9$_nUzn^M)`I?ft$acGykOP%ceN#M4 z2$t&kcggCM{9u|Z%7t^()7XO7Y}3m=_gwDDlX=d9BFycpIu<1$Rav*ke*9& zxa9@GvL)*t14o`BRY`?R)+0HZn>ygs3uWPw9Bg@kS$Y@u>b`uJZ2YQ5-OHeB;T~f$ zkAW0r4Y`OLc2SU`Hb9E)4s*3)m4(OyLg<7)i128$zmh^%aN{>d$va|5Y^a|Le zSGlxg-D2SAGiqs+V5Z-NcIj;0bb|$;i&}+)8=_k{M+9zz{MT?hKQ%<~TVY{1qK8ov`UyyB1AoRD7@kzQY}Q*=ni6HuNjZzc55N4Q)FsQnV=kwZ zWmn;qe%1n;Z7iZ+{oLEMxOFde(w6wjWLfjjc4gWKyv_DYqL<{jFTcs3fr$LdfPCn2 z!7d7Z|ItE2s1G+~JMMSn z`%8ewUKQG_Z-fX^ga`_Qq$L9(cO61*8|cQ7B)wDo{$s?5&cz~=dHuvsKO~?ap>&wo z_4ALEU;i!9Eu5p=l3KCBxrXFFz!5!+2o=f1Zps_@BhIkHdw*ehIo|HC`+_^H*mYks`SPpQn0z1wZPTnzks=wE;s>IeVQa6f69_=PmtWk4EmyE2Y< zoh*qYfnQ5Wlhxq=`C6XuIx&!|$TL{Y)6Z|4%rZXiDo&X4H|X1BJH#?R;wrAOr5!t2 z`frgxzJJp;j(xnzK=3-y>Q+P|dMpD$)?B{ySS&Amj}`bv<~I{k-W&R%Gw4+CxuL`Gc`JO9*MW_Cb4#Pp+Az z9leW+rp*J&aVA$M>%mLsWrPf6Q7dgOU{<%;Qo6BX6$cL(zrg~>9eCk*>b}M*`~EwA zmy)&vk8fwWHGwIUtmx8B=+dLmvR)#(9UU9sQAUVvbLt7yqbzjX#YPVCg{93kbFyLR zTGei#2)7z_@F*Ar4pzQ`4vzRj2gA7>GK%AFf^qc{I6i$7jwf?N>sVQ6UDO>oh(Ee8xg7-7i^z@>Gez$JgwC4O}L_yy=vNjtRutQ1%lFvUKGfp=rg7=Gj0Eqt9s6Wimc4%S#=mLT0$Q8csTxkvf9G&Hn@s(l!(Z+%kqqHvsEL%2DQroaeS_e(L z%lmLj0SIp_UUnD2{!Z(nN`P)f8``sV#ml&4&nb!C;FK~B*IgxP{aQlxb?YML`p(rS z8VlCpWcc8lE@K;7Z}Xwp&6X|x77>A9QF=vndX~q&OhS z2+>G+h9AOxaZsr#Fk;IWv+xYOiyS1;ddrE>o&p3}VBg!jq%EqN^}*d=NG4|^C< z`O`Saz&M@GD6J=ozN0AmwxHf#UVlc(rjj?3le+tIQhMQRRdXOHe0>`3We#LV4G;=D|AXl11FX(MO((#7Umx$x7W zJ?vT>Jo$YL!=BNn>2vb*t3I=eG0-#DDSK$>GcVyvFD~B$Smn}A0qfVRkQeo>9Z?1A zbe?muNg3Y=_M-7NAGn|fNJz7g{RDNc%bO*4OZ=GbuJ5|x=HH`yYiP%!*H7YKj|1r1 zflI*B*W1Cxo9Fd#-0SfXR^tZsc9&}&O4>emlWEdJZ*xc;yAn<`I;G#@U%_Z!$8oKW zP0AbN;iK$fTgUMleYgo97T3c!x8cKK^dSiN{B@5<(Vh)to-4gZ{C@+bQYpNLQmG8y zL#YJ!_y$N?dySSmLvy>5tQAg8MRxot`*(q0_!?gzI6p!-$qsg&z~3q`l%!X2q!?nH zSrvQL?q4XN&JnaO`$dj$(qGwG9#dBEM@hzAZTDfnjsW12B}}yl65U7PGzs%D0AKtJ zn9Q8#ryT{6MG+7-3vZSTPvp8Z>9vjNhX;2GTSv%=TKn7;BkqZpJWyHt4{vqY`YyjX z-s;fxU8>@|)gkM`bzL%1Rr*x561A}2>M_GA5Kcpt2_qiXYeJf1o3r9J&13Bk`KyF zPzpjR45bK^vn5r@^1Y;*bknk)`5+b4^{c{KFxnRQJK8SCeyhN}iA}15a>=Ic)|Me$ zTi64Nh$hRCMgJphnU|D3_@g9SaNZWy+BhGZ1(r+h4kDaFjsdc;BlBkn2-i30(-Aj^ z&4o9+fG#a|-COK$%WEGNI8J932wun=V+d_#+i76ru4LwOS1!m?=`6UEx+@v^+;toC zP%`kjYaq5KUgSWf_dl=g;$CM9@rDZmNNHyE$gS!GXt-+#`05&Dr9_mk{)G?S=z~9e z5J36r4tzKV9*Viyq`0<|ZLItuKTR$UWaQ}`h$-$jdE*um*hs|GXmNGVVG_4P4$&2ALXu77`XcAtJxAGV}X|%ie zQj4buULYP{B7P5CHqwgwg3Bicag5*v*Ic^LOtzh%m8%Y1-}S)VJieWtS@Tmo>39f- zl(DVn+EM!Tkd>lP@)AcMQ1aS~KA_~Kjy?eLVsln&v3?5!fu7VND`9PIgHi)ZTPOpd z%z&~Q${`?Ow5R4Ou42R|IeD()epRFtqdltZSbT`AWEW7d@X<8dU|VeK_X`gwBAP5m zqs-35`yNtM@MlTRT$g?N!1{UE{2f`6S4XdC+Hrj{-duRIWRyUTO|;pX0?k&{-)3tL zn}3_F`u|n4B`s{7_qW-a`w;lsY#INrnytv>g7JK}$+lp*>47g|ZWCQr;5X)cH@B$? z9=GxSd{U&_REJgmbcY|_m6R4q93r?)jr7Y+SCOX13Hj4s5+dEWTG+-i7gdMR;A;(q zG+Ij5C>bo7()AKl^e`~nqAd8$d09L^J@H|oU2Fkl>Z0vxbge*Zqw)j<7^Q(lq zu}0k36KpsWx7EwJ0XEJ^XU@peZMIfz8s;v&7Un`=&6;z zW2~G8&YT9LK~9B656A{ix0zYBDVn?VTbMV5rVr#|2Sg^t$7acwl5sfth#x&9CAE1Ud7aIrC4qIasx6n@{ywO!@fYbA1gS59DA6 zge6=F60XIsz{Iq=u_oNu(8 zX;8%r(BIrm9TEm!&>0>9FIKoG9riHVM^x+PeRSuOs)q zCrU*!e(O$lo{A`0F0yiKmC?1JP~>I#u{T5iM4O0qIxc-DzIsUJ>bX!boz^a(#0`8 zEt=r+f@aGBa5=!RWrv`(ix*wUZ8oWh<5U{AXiBb9nR~u;T)OPjUSbvp$hocV+F|{C z2p)F`9(o8KRtTOQ06bpJH|h|yX+K8LCT0{+!nUi*NJ{JFD+EL45HV{YVpt$zt|3Ty z^AdR(e;UcGEd*F81Q;?sDqJRhe-!{)F`}WNFP=kJ1-bo{1P4%+6mOB0&>-2{UY!9? zzXOkfjZ5bdd2JOZ;>NsNcgw+$bc%1CbFy0o4kB73C|ag|R%%o>w^cIB@V22@UF?z) zJ7P0op5;Z|{Cl>J+4^mk@0}5N)eLO5cK7e!QNn+N-x9 zl;j8zvmXMC9|DXW0_+B4Fqo1vpjwd%;&b{=A@-8FEf<95)#p$20xOzQ?OEV`I9xXS zEKDzuK`9a&WEvcBRlni?%M2}m}XU9KUiMpRU z;As+r+@j|HeC3RJqS$d_^{XxcKS!dJpP=>gNCxDjYnG={I;4wuXsY15x!8yZ(mQ zP%^Z@+7w>cH_!b)T8X-E@5`~7bI$yqubeSYa4Q^)l*l{i_~uKAqmoD4v`j%wT*1I1 z8l-a?D_&{%09>xn8~T9D4Q9jh;IfEu3!k91%wwwf_4GHFQPyVO)VN(SG761W;v>`|ZU61(Qc{M4EW!?Q9y`Y9D)gBJpO3!oS7xc0qvCYtny=`He z?_7P)^n0E88ypQ8ZF`K@1l+urN1e;oJu2zrbH})N+S?lHdATbp(!!2qtXbVDUm$v zE(i|2>-1aL1+C2&7w{jxTk>|fXuF>?psDR8ANKT*m?2FP6WS!fb50CB=ZYXzU4v+2 zhiDU*a8$Yv5My+Jtc{6>ZTJv8^R7cmQi1>zf&k-y0Q(m*7${?;f{qM-@4R{~oeDdS z&8yFut_)V-Tu(!(_8Rio#m0`$wGThh%fiGqLoeuO9R+&%4Y8qq^@@ymmK;M={nWfI z+_8}{JI+G)QRDJ??D$73QTO%Q=*thzng8>ZGtJku!K0}J-^iofL*q8w8ZDRPShidQ zhn@#jNIIL8>i}KI18_M-9TLqZMU19JKJD`M&?qS^;Zof^_iZP0^{Vwcx5gWwBi@;c z{7L|srvQS-6M}~kf@ck+ssoU!lF_aTP}P!qU0b3+Mk zVd3VDQpbkw8m(`uBo3K)itPG3VuK8bvuyM1xH`}MKUz7{{j3o?E-`2RKdeN}_mMn1 z9)~>DFFEfp|>EA6`USV_bt@Csk@?!uE1P?m|k0Jz5ElO4BIadtP_AdZK zH>l;~u;DYMz-3#nj=9UB?FI4kD1Y}KU5t_yZ-bA-FD zVdht-AKCFwR-#HQYA+S0ll6{&zH+AdB5`acnYL90mP}3JiR0yw#IX_Z+vgA#{B;EQ zd^y)?g4=X2Pd;hLFMnzPXW%wbg(nTv=97je-KK}T@T5`j7t9iEI5lc;H;)|kal#+% zIee5yT4+Szv+bd{)dw)WiFcwC`_~4_vW;ZKs9%Y8bvTyMf)83_-QoIm!m+et`>w_~ zL*6jMEB2SJ^c&$#;3vGErK`z(5J z$}Tw~n4IfY*k1X7>-IVm_5q<#CPA4EWhs>PQ1(DMZf`L0asTFy0Zb20&m~6;lY?7! z!TAaszE2U~*NXc-dc%qkXXP-^n>XAmn%5MZ*Hnxxd5`7S5X5sU;<;OKMm@NFF3y`V z&UKQw(HLcTd(Fx(&WdHA_wjJ=y1d;%dAnaCYrMxsbtgVv7U;m)_TV&JoJBFtK2}w6 zR;mNN*~7i2X&Z58S>df<-tOSM-No3h_t*qv%_tjQUlAWx6YJtEf^oiXl@@0uHqiTY zxR)<4Hz+UnCARiGHaJ(&l83(--j0o)oET+A*66q5oO^V@9|^VUkF&BG=*=DO70JsD z&dV*v65eC6W25>LqpR@EiumSC#=2CRm*k_ez@%=h%j9OvVCyJjP)tmT8x2^-{(1X)<0sk<_q>mLo&dOi_{5Af) z!g-kBJWMgR|2;NsY*cSzlpUX^h|kOHZBEVU!HJ~FTFRx$`h+P^3*8eqA5WLKJvuRT zdDMIF=rg);1FK9qbCH8FeOSETp(<1wD%Wyvhe ziw8s=%D!gDzxeE>8+z{4$ez?UPaaM1YR8{Ej`0_^MP3G$uF~RZFEeLKX1QSU?8*m* zY;iE1wlRJ}z^@1_gBqT4wvR3m%mZ($gb|tDs)Hz?bnA{g#?vwHtr^}N=O=+^x};C$ z(Y)INiwAy#bN-UOb>^#=4Y+1?YNT+;2gp6CV~Edlw=EJM4vqgfME175A*X%xl)4Mp zVT3j!FBD^uARxEa;h$sX4UxS?Z)+u}ahmRkNtv|ohN&$zFn1{VLT(uKu(vt0Tyk#n z3vZKb$7HuSd#l=};ob;s9s-Xx&w+}d_fhY!N1st0je37A`V7l8h@`63QSYxtpW)Gt zdVeMQjP`Cd)4fMC3TcIQ17J}np4p>?QKPlI@27WSWRGY<0kjPQCA3gt)!GqveYe{*r(dJd$(PmM-623^gEWAIp9D*9OpO*rV7@~cbXyt zHu5N2qh-}ZU7#jU`-RWo zWP1d0avBm)DFjv+1l9ovtOqD#p}^A7z_3X^l$GLrITt9CXb7Nc2%z&2Ku-|>@k0P* zK*H*QcteT^DIXc;*%P7G(jO-ryKpvtmsm`OgY9Kpg zf5Q@H{kL)63JCT5bjbeEk%OZ%*QTCdNt9}aB5P*PbW5|F|0Dd8Vcr6ltLIRS)z-&6 zch$wP?a(>mb!3xI*zS6-BOAbl*YgMuxSWLz6GqqL2!~IY-iUl0X!n;m)xRJo`oN~lLyc?;f zpVXh0KRpmE=Q=qJ{=R@n5)t_+bfmgU&QjLL5x1ph-`0Lkem#LsqoP=bVi(I0yQq+~ zWdZr5(|M9g#L*k$^;^bs#5x^{p5UkQQ(T7|rFa5d^^fi}V7|zwq2a*w`A9;1uT)K- znsU8OqHtVTYMYw2`VP&K`>9XPhuz$#cl`s~TJLA-$vr!LoOH4;uEbgjV=Y@hT1X}u zt2b#`HW_O{c@j!}C{IIq2FmkLS~h80?&vtU+SwrcA_ull7~5yh)Tl>WoHALKl9P4u z`)KP&OvgvP#%F1b&u-`t0(Bg0zC6B=oV2|xrKBvyJ8R^4_Q-N9w=kA_)c5J+YgTyM z`q8N4H!SdcYe)>-ZbCJ!9U9?{JnVZ%lUVeCaysQJ3FeE{eg|GrwW;x=GZnq z?p12wwl#o9E@Y|~JobP`SMVqsGSvhg>%k)iJnjw|4Oi`CbQ^B$;SRX%xL2sF^nR-G zd8h09^m=NBS-qdJKIq|Nz8H6`S`i@ZL3}Vkn3l2_K-l9j{Z=*Y^E-0)AC1xXB#qtB zIV!g2K^FT6YiwDpj}xQ1iPnK!x+L+GXnoIPq1wnxrH6^ZyqagUY83s2G=x9%9S+O} z)1xGE_pjyz%Y2}QCK`uYc^mNdk`^Klvttnjlx}Hi;)4a|zny&5fH9tSYp6VX$gh>z zJuN*!U?(pfF^!i;%6iW?=0(zmrI+}euWwO}Y{KiVfA9q-La=_#cm4cH0|$#LJC5sF zfliD!H5-or*ITuqd39u4U{t+0rAE>HSvTJ+aP=3mjDv1LzmtM_Kd5XOy}9KjcxC)9(dHZ6N;*Sv!7b5U_xet$_wXI=aJ`_0H9k4a%5YIJ z;eeQp8ul{!kOUuM(T8OC@DhDUIUu&Rrbh9bU;g(9_zOvEA}GrhLO^MWuq%QLY%u z@tj3dYVOOnzi67Jn7?THzj0Gi?#qC`X!?t$|IJC4lKZmyFPi?M>3@T!qD; zKvK-@xhtu!cTzGQr6NMDRo)n}D8ZqYlk;S+wYeBY<#5RgIIs6o6|_&XFoCh>4DKUg8|aiKwmz|&q0zz z{A}PhU6prl9cE(k>agj~*tW-RM2z2bHP2*Gmui7kZGNt!+Yo7+^)@+@s>9Gg-$WPg z#It+%wB__ju2Yi)rE;q;J!7AS656&gTsn2zb! zZHvv2Ik8kB-h|sZXw!`n{SfydnQTno%}oyZg^m$2c3U|3+htU_cl{F@zv-;gV65}t z<%l=_m4n7J-bJ9^4YiMEOGh+LFY0m}d|Rj+;y)zg*llPW77@`?+DkGyH=XHrMD@(! zvySQi+*T@=83m5|yPhtRQWH~#1L!e6P*S<|J)dHm$HHD)TN<8H!3PB5{Z^dO_7$4jcO6qV(`3-ZC7@jc6id`)z{V;0h#;t9uS6pgmO5QBRckASxxF9neMtFmQrPgBVe0r~98`k%$ znY33|9H4(;dW3FDELh1dv@L8tdq~i zcinFLaNLsinC|xXi@lA3E#~Otk5ejVyfAs`Q@~m2Zcfraw`+JAV?!O&tj+R*wq)rlomkdGDDg zOOK|0d(b8nuujp#FZmW}JDm`KHC%afbEHi5qsOa_oJusx{A` z+b%!*{e#WP*Us+uFTIxG>+!y5RUrK>->-DjiV;QWHJHodo`SbpM_y*+Y%ueEb7hR` z;lZy>UW+@{JpS@5&y9O!L{lH%ogHG%T`M|Va&}q@)Ly%3#A0?hFsObxhlI1`;wZIz7)Lu7}lF870;@)k|6eyW}8FE<;<&&PntBaB9=~1*T&`HYGcfo z$#x~uBv?9&>W7?4mHj6zyk=8Ozhs8iGVdh1>KjD$GaaE0|Jc@A?A3|1UDn-vPO*;= zF7w1TS@p}8gCjP+pBjv@UVyJo2!LOGicUw=clTlzotj6wc6AFxqJFSTvqGmgM}+!?b)kI@Y-j){+|Xr z>dwsqZaTMhRragh);!XFg2tOgRmy`sQ^uz%TYNRU@gBDgF1Om_ZoNM~u!8Qj@Qc$9 z#*ZHQZ$6+N=D;s6&8(`Z=CDNdE3=QxnWfFgSfVzt5}4SNU%2T z)5Ex-FTo@y;@}|Ob*zfiGbtyBAx;JxL`3H2`LA-F9GvJ7Gsq_ro07E+nn{CG15LqJ za?`}A@TrQbNLe=*f+lff2(OPBpB@^@i5!jx_CIrTztZNxW5#+r8eTX=Zm@8f81G`~ zkK~cdC6$zP;qy{`U0jJHP1>JG9l)1$9 zt($3#n1PE6sVSe-i&c%pPmgFno{UT&HcfJnrZ$s$+ugcwRoxdS;{14;-H5{-)l~-h zfk6f-ck8FdKTLgYn#|?Pl&g7@C`iA&>dVs2x^1eU?e z9Lf4%ALAqC`FHas2euEhh#5?O%eB8x8u>I{B~~n#KQ_@rAWcjS)ncpiiO&iqPbeLC z>M@W5jRy_UVSI$abgX!}<)(&5f@{SRtP)Ojm-L7~e~$c*%)?!7j>KAK$O_QqmM6i{3b!S=Dx4odAmngj^x_JY)_UGbhDI<$gvVj@E(6YmSNMD)g%B$^nDms z*nKoH+fQs<(_?(n96xm)bG|``8;`*diU^T%)8l)uK9LC)%g@*0e_ieHK8jS+VIx+T zzqzGWtYcj%?eu!R5kDU8Jhu_=;pYU-)(Rh~QXc8{jify_ICj2Np*?Fox%J+z-lHm- zc<61QX*ho3){2DcA``35Kq)gqNC*$1j>dIb{aL4_DZzT{!RIITB&c}5Z0*K=3AD-o zc1}#Do~afmCbGfKw5_C-=9|GHt+DH3!1m<5*Wn{C#5XeCh%c0BVZWF?l&|NWb8u*j z-rH%x#1plgG0uw9=1!md=*_n1Eplocre7ML#__NxU@PVTdpus$y(eR96a9&5tA9_% zbAZ2*X|=gcHOH2aJpC>4I@o-@qgQ&cOmRIKp-UrV-Wn_CZ#^HX|7cOQNxE-%o_pc& zi06(bC0;A-W2Yv1X+kW|im~jE$N%$GN$j{+k9bUpvO$62gi~Rd<(XQn@PjSW_S8y} z+g=7Rte-VE+)>OcQz2rw1(R#2EV=R{j$JdvHHRubJa4Mq+b9!WZ&)bQY!CWA;%z>G! z&HnA+Dz(l{ii3gHg<%tHEA;!%a@4K1@(L6^9)6qp#Iu{?5)2(#EeDf(JUykK@dm~y zw3;{<2Hn~dWb5>38{Xci$8+Rh8;vxfm$2uE;l5^-*@>M!xK+$_V(+AP*R8hBd2Htq zP#l>3(e4(y%uBJ!3*aM^!Dz=t0dPmoj-ve zTpt<2B+y?yX(}r9&hBt1-hKl!-6Z!|`~ADwytk(;lzU{Z=JEy-?+K7_sUiB-(LMg+ z1--zdFy?(bTTmq}f`N;K)^yQ`t&q8QZda_5wOLt~dwh|aXjb+4XHh}RBGh}LqTkW$ z@4d7Om{|Sk;~g6hWyaliwk=<;aH@1I!(Jf~nWOqydXH&6;`fy;#d7*Go!hmvnY@A6$IPWN6--keq9iPqZyYFXlm?zrXXL*_1*TtppJ5VHF z2b_Fc-(w8|{4E`sK8dM#ZkX`lGd-V!Zb5lU%TfEf?D|t@6N;8;Ju4_@mX==IM|i4d z9rM9%kBIbF_4@nKk2$j7gx**0>GkdFfU^9wUeCk!$1jxV`_5M04)N9}ht_M0s#zNb}9|MY1Q)P(rq zEWOrJG6)Ga&VrDup=@E=3(1%3x?Lixhgt5D2%sc`37EUmcTr{io3MqFx`HLiyQXE&|A_|D=+<6A2b{W0Xcx znhOB$>n!l>QQ)nO&;aRtM{j8__15liJ%T%GW$*i6VX#D`WfA~lVwf7gT1WNxrx&FN zLQo^Bdpu9tUqYjhRsRWE*3o!H53-nE1o!_{?TGZY;(br-6A9G~pUxp*+JAZaNa)&| z_Pd7F?yj{=9Buf-oNnfgK>|MP+3RzCam+nt$>TjVV$xi_c3Jq^r9RRrT4Dm(`_#UE z_p)I&*gy>kb`J0DwLy*V=##!aO89D>bK2SCM-}#aHcD^KjsZbBrE2DlWB)=U#P__z z6B|}p(tGeO^C2PrrM;W`pM=rg&&+5|0eI`+|9X(QoSqJ;Q0*a6s z8~-m-geKn7De+9_>rX`@sS>r$D4JRPBW7i1G0Q;-voHta6KD**7eLr<-o+54D% z;yLR=`(h>U0AznF*a*TV_EJZEN5XD;#(almlvFI5uBSz%Dxj+3n4W*NPOtvtYOqbL z4$-6|&4pAiOgE@mgc5_-HfXFy32_#bQfl@H(G()+hZEj6BuwXJGOe!%Or!_On*k~B zkMtk`hQI_g22uSH;1MZrskaTEKykaX+y$DNuC4I!yL%Zyg)LH@`;c^3B7m!=0Ju5- zX5V^LFgw)rj(mQmaV|`!oX-0gf8x3AwH0({!zKh)g3|A7P_jPMRFTVPr)+C>0`Ffo z!RFif>;zt^n#%+OAgLSH`4v-pZ*O(u$*Yp_;xY%kvT^Kp-|sgr;NodCEPj}0AlUik zrb^ITWKwzK?M-i5jD*59wugN&v2CKg7oO8$Imue`kxizl&qJlMelk`1N__UyHx^1J zmOck_!E)J$NTUs94v#Vu< zo4UAaF3yMB2|;HAJ-YX61XjF4xAXA4l8L6ztAsBmnrrVh)>&?@xTsYLb#Ve+VVxh- zA8ZZO6kJm=lK!C2IO74}eciKx52foL`t;3CP!vj5-yV{qxAk7Aim~~l7md?L>O*_> zFKTjV5`6MT#PLO4Zfv>`*pH>wfdnzQogL{nRSaO@L3Xq*DgYl2+BQA(Q8{TY8Pw@? zg8kl;sF{F2{CvCY0n9A>y$6VcBk4lBH1`nn9F`z?|G)>`yO{ByQbiLWKU-hxz$St2 zye}&EO)W)|PsZM3J-y~hd>jEs<9|~{(frYSU9sfoYE}@-ob{uPRc*N2;XDrhBBNP| zk8RZ#GlX`ne%y2%pg{9%xaK<)K@BHo?2LSTuxl6n?EBk__aB}|vL2+Vr+y+Z`kk(1 za`Z|T)QyXoC)kk?Y_CW$(F{JO6^EerLAPDe|HH|j2U6K}f55mQ6iLcZ6qQOLl38>_ zr6hBdggeSmA(Ao25GA2WXfTTuk_wpR&ts;8gEPEqUx&Ky@ALb;f4u)Z5Bpks zueCmF_^iF_?uLa;TKMS~R}GK;apEz!$Ub0aqzT4vmOb;&Z?DAfDMLFMS0Ge1lu7&p zArFEuAHdr82f@Ezg}GL~?)l%ZO^=>5?7Q7+v?J@K!>)%~LSxA{&)%fjf9lm64M?eH zr)Onfx7vwCgN1b!jGrcG)tB;;X8-xuar(^5C?~C5M)_*0t;U}Ka?t|VWS%MVe>a2k zgd&>r?6R-pR^t1w&8*9tRX#htH~fIr{fcJTZ1DeUvleJ(cFGdn4ZzdEpy^Vmcj@$X z25*#|#sg23w!eO=zY-Z+DoS4nzb*ccZ9EFUiKF?n$W>C7zgK$w`981`xMR;wUq!ij z`Lsc4VW-iia;Bhz`!;Rb-L#OgGgMhA%(m(%Yv%8SD@J49vNN^6*bNtpPJXyDzSQ7l z_KQW%_^M#zbh<(qelOpW&og|BJ1Glb)a)K%xsir`a{^KzNb&Yjl`A!HY69DHLv z|Kt0Etyz!vT9zvZ-~HLW`xNgZl2SE;==lE3FAdZ4JM5h-%lGlJwp^5`x!^$E=j!KrDxU4kZdCqr($AS4by9kzTJ4<=)21)vg250!0 z(wFCtF$W!r^w8RHpzPG)D-~IrgtF^59h~M~FFEkhawF{N+hKVx_liYOR_P`};=aHq zb_0Dprg8_5^M8-Xv0Ag;qAj85$v^14sC)bDcr2dpES4JBM&Y;k-F*l)_8oYZxKWas zv0$G*eA~6DCPMQo@5TPMD+A2r7Ur8*KYAWeqL*hAi;|4YmT0Y1uxR^=`}H-w>Pgw; zs`YotqWQa)f=|)C8j@J7<;$x2_T@@RVbAZf=U3@7u4n2nIQTII@4Y@NWKkAYhx--R zufFhAYxrB{J`OKE6?5AgTr;`u%sPAeZr{6hz&rDntp2BcKOXNb^4+#TJuh82bU2E5 zQ-nn)mN=`=yWQ#e7W3^VJI#z++dW!+&G+K1hCfRUeq7DTC--gjPo4{^1M+8!RDblD zO<%8+Ha~oS-3Q8ax2U&lf@*}MlcSrruwvnTnT>BF^h4U14nM8W-A_Jjb@C#Ef1Kyg zuzV!!)GWTB70D{Ly8iaMyQLGVlNm{mzA-6Dx^BN5 zp}Z9*`u3>!g^&u?7n zjRVB9KKt|@Bw4&;5K-4X(l?x7xSI9!q>h!7;p#rn!G-Ct!*s~_s&*f=49Pt9HbPBe z^~v0eR`HGx9|=#5=WUZ8X-|#Z7tVd<(@$A2VdwO9O+%Ib9e3|2z4*Sn_?1q_I_0fa zFU;K(mAE6`cvl|&VRp!?^P0g2e(fZkx{!$8z)KPXI)<2iY^s{umiqQsW__<1=eg3_ z@G-MxM`(EigIHCpFpluat-Eo4H?o=^eucDT5;knThXw zRa+DqTS#w;46oc#*e&`tjB|Rt{HL)`d~2J#V$K`$2DO(-YL}VV-flVgQAPE8U@EtY z8u^Uay52d1*biIW#k~%hGp*{+iSR5kJbq_;#%TuY*FILoAENa^}>ueJw7Z1J{S;^N#ytkwB;--OV)(|deV#zW5wcLFIp z3zF{K*?v)NpPHk`s;Iun=_A%}C5ql%esHT}?{0}VZ}VfHY|m+@*OqscytRYEuu5%D zkB8o8tvj~@j05^EkYDDVJRfv{4C}6M%WYT1An84Y!-K|ZSI!6A#}SNeI%GVApE3&+LYNxZE! zuSuoa-+gbnn&ZaCma9y+Hf;zRV-ve@JoW~E;8;|4>UU$qk@2bbbg`G~%;)>;UZgRx z%X~77JRfVpM(INyPt zhKz4X7m_dc@5mMA^>~uP$v4LKcF6eM=OY1c(nr)wU)Ji32KK?n#ZQ}5{ch6xZs%&T zU`Q9XMgYI_s80=o1>S9&KKm*2w8SoZ65T3!;bN`jTMNtZ1KUQ7GxEJ?;`S*oku&$k z^oCRezI3#Oo2_M^GqLRC(yUl7Ft({BG5glqz@u~hylMe`JC|t-xJhU)xn3^mlyc)C&a|m>-ig~y zdI#4;DDGvIZamN@(4yU0k!>qDqHy(7jOA+fIi}SCwdS2i)hFcZ@}!j~QwleY7|(wd zIPj&tIQ*u~vpBK(7;_LiuSF=j|1S2&#vJvz``dqu^Zr}aR>1d}om%I7#7RVVx>mnT*Y>P4EOVicpzPZD!g>BeR@41FmIA(mC!{^-}Ib?-g2`=tc;?gIYN!uBzT2;5^rKCYGhVt6FwugF9Vv z!#Dr@Q`wxuFOKOADY~h+m6_c4WPJLi^v78xo1l4?9fc?I-EBq$w&#Afk(Wsz2ql)w zbL!o?dgA3bCUMz@mWStpeq5?lG zcfP0NxDt^4>#f2@mwttVO^)B3J{m8IJ7lzcH$QMZizl^;z+3<#;+zjJwOM9b0QIF%{T4{Z_uIe?6h#YN3ncw0BU| z^_^49?`0bpN*R<~s|Ui6K$zDf=bg_^h3u+nIU&jOZ11^T`qZkIYR9+vTK2{MY?4-% zo3|_6EBElI;pYB6dfuQRu>l4#Gl%1>>dzEiJtrw<(N9_XzkXdR6y@4m(zxngmM};5 zrju@C467`Lwf4Fl-wDB^G-Z%)HITUhHMQW&ft-XmXXR|0T<0{-sE+SF59BZPar=UC8Z< zXDB|S5&Pt2s|C;c;9BE7#{%v-{}B4p@{#9!*_%R#Vqp`WZJSQ!Y}`f?zWhThMO!wD zKjW25tDUBApfJat_Mf|-Oj}lc^xtFyCph7YA|3cr3UNyf=IY-d~j(sv0bNxAn~ww76oBqwD5p zThJvleW=B+-JJVGSx4?A$@-BE(q!yy{>E*tdE+)dpTyc5Ya@HCa62{KTW@hya2cz^ zN7jot@5$(M4)iBZZ|GH5F{wIswpgyNYrKN7@=l-HO}6#-631B97i1KN#jB=D5-iDK zLiOg#R}TcuRkS|WIhIi2^+u_E;|@=Ye=3p%&aj>>yPx6ZW!d?pzhZHLGunRD8g;k1 zgbzulKFkPN$ICPiObZ$1>3)*zR~K*?E_*EKQ{8((tY1BO)o{KmW8B3n;<(m?&EqDQ zIWAT_n&k~7CJWy=EMBJPb<6QVTE-)X&MU2lZE+3ta?08JE=fE@13-VT(Mo~Ltf30!7+MLm%RdjIDTK||2i|jLvCzXvmJB6!T#`diathym& zi@w_(8OQVs{M>R*<)OXk;FTMC$%*zeTL$PaUiwfmrJ?fNX<7F(`xheG0Zx6~c7o9n zpPeF}ov2DEO5XQG;lR~@wyD-1v-%v8DqYc>;KcEB?^}hS4B3vfaYfVaif?bETN1`j zKsCP02;1$p=KJQ+-N!SVM8YCJG4!2P_U-Mw&o5ZY8p8B9 zzrRi&l{TjJy!~@+r_z4ekM%pFe`#%o|1?irwpQsh{logV8@weioAq#Zhn$V*8wRK~%L!c75>piT141+fM1+IOW&K{r=Tlgug7`1Zzrm zPFc&>RsEN5R?l5DxaaKBb4jn!Xq(d6CDWkQ)QYknai3JzNL#*%7HpB>mi)m|e|tUG z>atd6{1IXqv(%ojZcU}LILUX$%onaOS)XM3^Q~;;NuSVsj^wD7j-ik0y;Qoreg_=m z_0lhe*V;Kd{Hl z=laK|5*OY?A8yH+)AgwhR;d1L{P^;fH&0%P5>5zhe4MVW`0LbE*5%wSR#&$dp)PgK zEO52Uci&C6y%jtoiQ6s6Yb$N{1!i!A>&FHj^M3n4bA34OZdh6QoAj%S4ds=e`0nrC zBjj5d)Zg0ZlaXQkGEL_YyYg9_U)&3y59gEk8&+N1sppnq@=S5RZ1#@RLvhR@JDs0t zyxN=iE}vM%F1&f#YxnStRQX3=!lQ`wvy}L(k6yP<>hv}AKh`zMCSR{#u>3~H4?y|^Gnm+#vSQXq_*+Y?OtzNCh@{%NacY6u|YM3UY_(%WLz~a ztG(CeKC5!&4PFyTud5$&3HVj=B#SAd(?@#G$wdt%PYzD8-F{yE@#Q(9P*JyFP@zIt zom~S-ntVIuEw>S|^M@=OHJ-@kT}FBoR2cOp`T7lk!cC@EnbIe5cMJCj8&6Pkh`A@c zjj8%1CUzak`{fh5q@&z*BGl)1tOo<{AX8(ui_jSd?5F!prAwX{vIj26cQ)od?^TUOs)h&QjSQ7i7<#^vg zb($!Q+LBz`I~CL&rnTK=8}CSe4W0FOT+Y0iHj{xPJ?7WZDSZ}^SaIslrF0F4-HV}_ zBjTXa*D{IDl_XGV#zlTJA8kUKmB#tQZ#pAfbfKN`#31A7(-ehQHPw$6x!k$%hhy~V zq`la^2L&G!-^|qHQ|;b8-%agKyt$tE*z!?NI)nxS5T@8m?%X)Xkf?#rs`^ z9tqp)KNbc%@XCQ&-P%*Uw`7=#dgu30;-sx!;KeEKmCsc}dnATzSiP~(9<7GZZnGL( z+Fr>W+KZZ7x7I6wDGF5+Gka!^gW*&%0|rQF5$YH(4c zm$mUzY$MP9#&`VND!d%UIFMSt?ugu9e>F@oe?^wq@b?Noww_z$fFjHwzGir`hGIwR z_gzeExj=4sG62~*Z${VHDadxJ>MJEZ{Z+;7Z9Hu+@b;nltFgporkar24Gu_BCsI8N z34(VD^OYHdNTENX>1(?n<6#Iq>Rwx$yKlgJ#LD#}*4;_q5E!7BCsj;qMl%c9_$q9hCOns)j{Uw=^?LT`^kmHKWE- zA)WPPO)4%|F($vs;pUji!_3jt?!y&3V%%2>re8uKqnn~#cnq!p@qH{&lX6^a~=9KvY@x(Z)RKbDZAR$Li1n!dhkDl`@M z`njcVVHTy$iOhXhd(H&!PZx@RL(w?Bdn2ix_)C|>bV|cbg+K|ymPLe*x8(RfR&F+n zy<=H3YXt2r{;Q=k#c1ExZ0h;o3OH4V_ub&4=qgu|#YCaVL`2ub7Q;tXdVGa@W`BYT z1|>?yeCP8GmV;}QSn-w7y7?K)(o=H6zkj+t4gMTmCc%1O*^n`^kua=8a}Jcq(+ zu&Gp~GMW=Jd+-R~L2VD+Auw?GXiIR?tQAr@Wi-pVk>b)T0R|dgKn6~tW}qQ}k|-RE zqr6>FXLNck^6=!-+wkYT%j(1^1FJX=8ciZ0uDxTRl71bYOY%)w=ktJn22X6PoJ^Ps z`s4@hZ!hXaJ@V}5YJL947dAr++_mB!@ma%;F{Qx6sEB46u@IC)qjH+|eIY7=gftlb zs^eljsJ&W;q`jmb!?*`Z2(#B-Yt`GC_vBjwp=Kudfkn~U@tGfZouBE4sC_@8&z~CMY96JLwCVKuTSYVds&`658oAt?{;oHvwD zjn*fJ_1vAcN+~=*HxTMQve={`9G&$!vT$qRT~Q)@q<1B$P0c@l^!Z%(m*|mnE~DwJ z-ex)_N-R;dbMV{hBdHDp_Pyyn8k8H<<>lz!Z&UMgc#o9A`b#G%H^`MVX*0I(Q}DN~ zUr{uk?OXT--5gmFCc!>H^q4hLZZfmUWWpmWLh(anqeHhMdM65~dgL(KbJNhW-%^A2 zNe|RCQqn!0>VDx87e!0MNNyy7G3o_2cFHTV*}~3*Z=Gpod(--Adgsllyyuc>1juqzAUGC znlzOw-8cZa`cuv(Q?r)}4e-vgOdAaF7wM`=fln`em=AZ_Zo|_9{TXwX+CV(-l{F45 zwa=hZ6(!ZI(e!!!F{+Xm#~ePx{}{Cf+O77RQBcWsRD;6UWVRWV{^2y=EBGN2T-Ab>XRR;NkRuT52xEh*-%Vuz-K9Y zL81BIF-oAi?lAov-6QeUc8zzL1j80;{C*>6irDoWRZ>3jpbj}~PrWzw6$OO_N>J5S z^vkkl^L2m`s&6q0&&b*B6jRbxIGM}&K9DJ`j{Ub8-YMk8v!oPmC>HF4yoOXdL#i4! zd%tb?cL-CFh1XWXD@I9)Iqh4>52-M6Z`u$8p&a*~ z;%RvJ^(y=X*(GLC^y)_f4w!V_Z2i}iK@Jh?u&#-G>N*4buDhE1y)fIUT zrN%CbGCGhr7|z1%>uWegnZOQmKIZn?XC!?sv?vcM1SwGOMKc~nB9UrC5*Rl7hmD;& zIEOzi9<<2OWcEV00|CYejRcc^!Ceg%_IY|5Q|dt~gIVg2;j0+`p(N0Rq3fXVpc2?{ z^zaI<)&y$XVrJzF`3QIXwb^t?mikLU3%8Mdqqq!cmW3O( zAG4?QEs8$Q;>)It9H(mFZRS<-smU>?^QgItMvUM=oDe}Utxyp|j06K*8l|ZSdY!$@ zeL!0839}-Zg^rz)vnU$&EpF=MqEX!OKuXe-M*`j-s(uh?^r9rb6{iZg5Ymt6&U~fP z6enuhlN`z1fLa1RkzJ-&;yns9)u{j7PpUzo59n?-+w3Ej)_DhPxNc=jaRCQ_Q?YXh zF25*DT&1**~ zDvOYGlcDHz+mvNzQA1qzb!0|ci#jp}_5m+L$qbv>s8vm|t@u<&s=z>SAU8drgjv_~ z2qhQecu`;>y^hkH<(xOCT_nh7``<;tUw}pF1mTGE_=20GVCb7l;JYyNb7<)Ay-x+F zJdv}M;ji&B0CDBHU=zGEp!|h_Y{rz@LoNpl{(Z`+0UfF?g3O-kLd%5{R1L0Jjxu{q z>d5nkLgVfm6hYdC`oj8vrwfelbwbThmBif`pgsUb?6BQQ7QLEW1#W?vft22SY6u1! zn6(vJ6(nKYy%*2$dBlVNF=)q(_HQzTJedl_xnid?vr0U5@JBR;C0PoV6Y$Q5>I+rj zP9{!CG2xj>B5huQK#?(~8kdCMr8>|-D#0T1kP;@__#A%$<$V+%N>@My($x`*)CRVD zC=JebH^P5Sgn&dIwNgUIsRMxYtM*aczw92CI7*84pgR9M7!N4hsPrlpq=60;?Bymw z!#&PMuoCA4dT&k42^!;}6#zCNgmgmq4ze(o8zeL(*vo*4$A1gXM*m#G`YB0y*?m+A z9|o6~A5+d#;M&w-+qd{yh%8D@RH0T3n^oLiZ9QQ4JR3SMfL zc6LBztuPPEtkF+ZKfDN~GWl1=oO`R#4H#Lta?HkUqE+f zKNZ7vDo}VeuK(oWH0t;w=%t|12T?xO)Z{1thv#InNfhY8#tGELA4+U>qa>jL4La}T zf-cS3*FRO`seP#V>XLSlMHkFBE=HHp=(H=^of;+~lS4@&20`CI?p6_(`x-P1biP9h zf$ER31g%*=lsKh8DMUp3`*%KV)=(R*nZEeCjWm&pGXs93;Q*J>`%Oc*93rslc~~t- z_9x#)S5|+X5fT)}^md6XYAwnzHcaglKiIDAlDHW9d7R`1tabI{5Jc=EofegaDHUch z7-+(eA}&94hMA1k@xZjw2A1XV!E6^a)Us8cU^fV4{K0TYBt4UgXyj5b6im`6 zB!UMuADECfGsDBf;n#<}Fjo&XQ&IUM&8<38lrlnkUxUY9L^QmJhuN@%k|(1f$&C5? z)O-hCf|d)*gF-On5i*nA9XSqn0GJaQ&PGu!Mr)A&>*Kz`yjgh;!OU+vPyM+FGfru< zHk2P5SjNk}9c2o=D}^=^d48>%#ig3<%Z@|yl5FD~44lyL`c8%lzzu-rQ{AGICRL+A zEbxK$^UT24q` zgci%1G!KsInbg7jQ%Sc4E%$wkdW8lhWHe+9^co+rQ2ZEKE(za6!v$GF%TpaeG|a-) zil)^s=|4kg3J|0?icvk4K!F>BKp{3&Jmko5pMk+@ZyGJ4Xr@HLNHh$EenGpb?4kIo z7y`lcq`$^HL-ZHA#0Y@F0lFHPo2(YDU$H|Y1y)Uq@UXlpacOdyu0EkOAKjH8Gs6CT&J4g$5Tx`O)OlpDMmg@4zxf_UD`c2W z`K`JL8QegXgwNNVZAs9|(Gh5p#Crc*e|H))W#?0X-{2r{dzJi*6=c(){1-EYxs>mS z_R#rcKr;{<+(_i+rovASi1yFJKvr6q`T0)r=NHm5Ms-iV<;i=KS)sVOE;g3VwBrXtJP^t79r9VtfnDM#k# zOznlm(^Y3vDk{&d$v;E*{>o@J&AsW!$mzSep#>F&+UGfS@YxF2QaZSko@UFlen{GV zZp$vhg%9Nl@_(LtR=I!IkemJ0jW=b|)pcK1q{zZ*Tyl!ouAv-V zzaU>7C!2S1nxI(5@#)F@*E!M;1|Ig@eQ^1*SK8`i_2B0TdJ`HVr%dYo?w)wGZ`lxc0(OfY1H5#Fl4Kfljny_be~S50YxyDImZ_L+U&1YSBMs{wJstzr zr*9tLhrPki_3mpZ|&zsys?H$gx%P@wYxb7dWqMwA#8ym8)?f^2+wRm~6H7 z#0W{##LD-;p+`*%n3129)=ap4v)&l~AV#Cc@}eiE$H3j)DAB4%gp;c~@=Dkp%*Lh@ zt~J4YCaZk;4nE@U=5$Zq;IK$(62y5@NAgJ%Gf6l+(UdY#I@m1X!CiHtc4jVOciNQ7 znimy6Tvsda`7CxMKB zI4nK#c)_u2Ov>jDZ6{PF*EJ0%rU)@}XKtU+b-vZ3;r{Z|iJ|VPg~~4n`o35h$~R<+ z8r&5fj_hHHH98g?Ft7K4-A|)#zw)_X>DdpXUY*+D?n=xb$#1O7IUIH=BI;B!mr=dc zIbl@^E*WO{7wXi5xvL3dtT1u7e>`w_$Um;^{zk8}-A6)MIY6*CmhAM1ymd4p*> zy61gl&n+*FyxlpJBWhqE8&ma!;A;IP?wD5CMTgU8cc-xGn4Aa=V7`;qDE#F4P-WNM zG|l(J>Dj(f?Sw);6&c$;>C?>q4Ye`KH%r3^*4CTq!dmmfA8Bqjsdyatag5ujK0emx z;a=y7{$lST(;CA3-R zrNzs32S)h2ANiNF4{VjHxV|>|vm{d62vL5^%st+9`{V>4TbgV3d;T=`c6vw&?v!Hg zmIxa;lWV(_HIj8KA)!8~%4G8)qeasa)O8tm9{8k~-^kh&bC-|cKofLtrenINnE#xi ztV_fkj7!UYC~%bh@z-Q`31J7xYzAIzbBua!H?vMsco3h6%VCc28zn4{lRy)4POrb% zPgEP3)}t{|SF7T77jvUY7<1$1g=II60!HxjBz@^F_^|Bj2O&)8;J<|UFriypKSkas zVUN+0;FU4h<9kdTV2}B=4HBp*_t*rg0?f9=OYG2DNhpV=tuA5d1xy^(D^ zfM4Z>>F@Jur?(Kh^;DVSSlbc$3=j(4lGEqGa!(aq|34Z`u%B5PHJ4oip(gaRr%KhW zzd|R_&nyN?5kb-T!ZAlPnsp|nez1I-$>`qS5HhhNw^Tx6R^kumiDKvF`~Er4Am4jH z8AbZ4IR;Vvw^!_I(^`wZ=XUSey?@3|o@Oog#t1jLEgu*zb+D_0PvE&Rz0^cNJXg_` z4-9F`E`>2foM1ICdPK<#V_5J0mfsXb>h}q1q}C#b>wWx3VY0u#*yYAyC>4+U_?Lbp z#;Atq@xxxREK7XO?m5Y^<%>2KVx1Nl1xlhp8zfUsayRW~?UtIkO$DwTb21os$`^59 zTGYGf@x30gydKT9`cqRk+2_}j!ED!KULS7{fu;bX{P2T9xNNIFs}A;Zsp(8*A$(H+ z!|V7Qp-DfFRbB(_4ocmJFc&+%9c7=twS;zi-~1@tR_dXnb{bjl-tl5L5A0?f%Tz8B zN7UeQ=%zzWQcWIzNO=vMtFF@S0hT8Wp+=G8knv|i=qbD;(S`Hdc~>EM`lUWs`88b=vteL zN_tPb=VW&KxyYJ$y$C4t{pIINXKltvH+wa_t!1+KAisE_mZ*UPVTn`(p19`yhDx5S z4)~VdQ0pDv$q*CkbGv*LB_AfK#u(zo<{iK+Adrsg+tsS1zuCsRsLr0gww6vM9(6QK z(d}akBHQT%_%d9ALCfK8>5N*ry8a-R?@+~`(k=d>G`wEd&cw)*4mXJ*L&p((rm?o9V=9<&;z~A2k!J5Ys}lZ>Z>c(NRwe$+F2K@j zLK#9(>t^VU5^kfs%e7GId<4DR?sy1#p4IIDVA%KkA>PcWQx72>wHOWEu-+DP7lylsBo7>XkzC%t&9;EOL-YA;-=bKsNlarRZ(Bal7UrxU!V(&_t z&FF7-=nPwmg(z%rkFwok?^@ei@10+E`%|}7er=^+Y3t?ZRT_sn+Blp`_|wdk#e)+I z%7)!a%;X#5>*+>a#3aI)=?3JoBJ;!L9wto(l$!}R(b*Fzv39PxwV$i5Ub6R#irBCL z|3ZT?ubX~b6P?OCP$Mm>&~7pk5Y638o=b*c--=4&tK=65QcI!ln55IOq1zTa_$mOM zHdya1VIT;i<^tM7ZYi;O-G@U@GS2b+XK4wn6+TnQSd^GS@E^Hy$v)ok^;aF6`*L~b zKZ>%C1PE_NKs z&1Yr;qN~QP*1q1MCKsO9J^qe7^1wF6&9i`pt=PJ7<`ib<5^d?wn&Cg*oc06rpOz02 zl$vxpCdq2;lN$l6uKF|6fc@B2(p-Wq=E~AIid}_YsXlu@duZu)0NRxk$#b-H8n%ogO|1On`G$7E(?KD)bP`r-D;8!dLT2>S*5 zbhM@?^OfJrS5C<=)PS+7w}IuPlm|ZnDJHFgoQSVinIS%>MG61H0L2pQQ*`r?&CJSh zKW&-pSi#>R{)-mPzAP+wn94484!T#&;GA6Zl4@dJ_f+$+KPzpwW6mP~d zjJnVzOaFjG$3%>JVg_u@-##Jn+z3)=o)6IC zHFk}izLXt}a<3%O$AkTMK)PE=&80b6J3H>p#>&3~{ALd_%RAY;8JEdhGq#f7pfX$f zhd~Jh8+PJf%<-9%*U^QSJ+*c1nACSG=}p(S@s?AfOF(H-u;E{evmR6jIZu>m@UL;m zhcUa96fbTiEZg5k0#3q`QCTEd#-8}EGJ^o1)atOF=B*}VOY4A7%RrDb-sE*>$eZxR z@bSBpH0O0&p};-1z0$_6Zci+0pM-;2zIQMy&-&Z;+R3|@$YDNe+uIS@1o0lQr;fki z0aS{0cW^1FsK9%TFwdnZk4eonW<^C7@Fzk69kP7YbF$4&^aZ(}z@ zcD6wo5su5$@)umAx$A^FhES7tM%PkVyTcZ-LpNimA!gVPmeF|-+rknAHDQ+A*fvQV zeNQtU2__BRjI}j%{FKwiemkS9INCJX;VqL<|U&!#kujXM~b@O{yLuM^eC5U!z%Vpz#(4FQ^=ke=vO*O$dfXFy|qG3DhM>1 z-WRcYP9=T<*m2VV(eh{VMwN=LKWvx@D0E0M!E%GxAWO5m-9ZNBBkBVlfYUnft6DYs z!IyR=HLZZ&Yd)m_T?pJevqhX;-Ys{<<&@X~XhP!b29SLqv{$)?-zy~t`kVnHAnaE1 z%l}hq?L5<4M`e5BUJP@H7;UprjXt}KoF^y@=~#wgS#4$ia;*QQ7IF*2yS%u^$=y^g z?`(zJY_@b4+iB`&f_sVfbAG`3RlvVPG8ll`)b{*t^1T|l{K+F2Hvg4#c_T0`<6wt1 z2gn_;3zgrYj-Iy3&H3LDR3gxUS>>#Q(Ic!x%?K#%! zRoO0Z4RK78+?>q%`?Z+{y$``B)EXN2Pci~!osu`TLMxPya1377JXxa84jw`uj+OI_2S#3&0~5@K*h7n~jq?l6N7Z6`g*YSZ>?Bw{ zc0SsW4{dV**(FdBafG8l=jbYdx^w#MP~ZS5XYnxtMA&j4Clbr+4u8roFmKluAlEkU zB%!K&%w1m2bFmGW5S&oAEy;EtV&|BbuN%GUJyTB;FSva;d}y{;ia{mO2P)+?mLj(| z-W&3fQzGqu?=EjlWb7=c#kOCKgLgSHwBWPhKGwbAs|mvC)UvxI?@0lk>dc1QnAw5Kvx~ zSg&I5`nBUs4&8CXnk7}hC6=|ViIss+d1*z5BbMX4{ogZ_2LtX zx(iD2S0;aI-vA223_4ay4j}X<3i}nhE9S-s%DO7{(584^5j2%(SWE`gh&2E8O;Ptx zW`J0^z$@nO7{x+oqs%GM{54Age~EzXjaYwP5ojl`R@%uym|y%2VUU8F_HeQH^74Y3 z*6P4QV4sHhYcV_I&pHrryYHcG7iwAd=^%U1twaLzTU|vj2So~<&IaqwC7kzbXBH87 zZ3o5KNvcP&cxv0H4YC&|$axN;HstahJ(_5jqW;IP7JHO>0D$Mt7!3Cgz =I5Ic^5oZqnAxIunI#7NzUUZW4#C)Z7 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 TJ_y7GyiS2m`@#|EKSBQo^kMO{ From e895d9f3fc9610d2ec347a31732c38b3a6dffe4f Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Wed, 19 Aug 2026 13:35:35 -0600 Subject: [PATCH 27/66] Register the mirrored floating case Adds 5MW_OC4Semi_WSt_WavesWN_MirrorRotor under the mirrorrotor label, extending mirrored-rotor coverage to HydroDyn, SeaState, MoorDyn and the platform degrees of freedom. Co-authored-by: GitHub Copilot Co-authored-by: Claude Opus 5 --- reg_tests/CTestList.cmake | 1 + reg_tests/r-test | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/reg_tests/CTestList.cmake b/reg_tests/CTestList.cmake index b8141041c9..a4775970cd 100644 --- a/reg_tests/CTestList.cmake +++ b/reg_tests/CTestList.cmake @@ -367,6 +367,7 @@ 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_OC4Semi_WSt_WavesWN_MirrorRotor" "openfast;elastodyn;aerodyn;servodyn;hydrodyn;moordyn;offshore;mirrorrotor") 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_MirrorRotor" "openfast;beamdyn;aerodyn;servodyn;mirrorrotor") diff --git a/reg_tests/r-test b/reg_tests/r-test index e1bd2b7b99..085a34c9f6 160000 --- a/reg_tests/r-test +++ b/reg_tests/r-test @@ -1 +1 @@ -Subproject commit e1bd2b7b9901a7199b4a231b0a226a63beb2293a +Subproject commit 085a34c9f6f141c595fb34deb679c7b8abcd3bfe From 4165f5676a536b02cd8152d99b9964886e7d343a Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Wed, 19 Aug 2026 13:57:04 -0600 Subject: [PATCH 28/66] Frame the flag as a counter-clockwise rotor, not a mirrored turbine The page opened by saying the flag runs the same turbine as its mirror image. It does not. It reverses the rotor, and the reflection is applied internally to the rotor and the drivetrain quantities attached to it. The tower, nacelle, support structure, mooring and the environment are untouched. That distinction matters in use. A counter-clockwise machine sits in a real wind field, on a real support structure, with a real mooring spread and real yaw setpoints, none of which should be mirrored. The previous wording invited the opposite conclusion, that a user should reflect their environment to match the rotor. The list of inputs the flag leaves alone is therefore reframed: it is a requirement of the verification comparison, which needs the whole problem to be symmetric, not advice for ordinary use. The measured sign table gets the same qualification, since it records how two runs of a symmetric comparison relate to each other rather than promising that those channels change sign whenever the flag is set. Co-authored-by: GitHub Copilot Co-authored-by: Claude Opus 5 --- docs/source/user/glue-code/mirror_rotor.rst | 41 +++++++++++++++------ 1 file changed, 30 insertions(+), 11 deletions(-) diff --git a/docs/source/user/glue-code/mirror_rotor.rst b/docs/source/user/glue-code/mirror_rotor.rst index a2c10a43cd..7d844c6714 100644 --- a/docs/source/user/glue-code/mirror_rotor.rst +++ b/docs/source/user/glue-code/mirror_rotor.rst @@ -4,9 +4,14 @@ Mirrored (counter-clockwise) rotors =================================== By convention an OpenFAST turbine rotor turns **clockwise when viewed from -upwind**. Setting ``MirrorRotor = T`` in the main OpenFAST input file runs the -same turbine as its **mirror image**, so the rotor turns **counter-clockwise -viewed from upwind**, without changing any of the input files that describe it. +upwind**. Setting ``MirrorRotor = T`` in the main OpenFAST input file makes the +rotor turn **counter-clockwise viewed from upwind** instead, without changing any +of the input files that describe it. + +The purpose is to model a counter-clockwise rotor, not to mirror a whole turbine. +The reflection is applied internally to the rotor and to the drivetrain +quantities attached to it. The tower, nacelle, support structure, mooring and +the environment are left alone, and are described exactly as they really are. .. contents:: :local: @@ -231,6 +236,13 @@ sweep past a given point, so under non-axisymmetric inflow — shear, yaw, or shaft tilt — blade 2 of the mirrored rotor corresponds to blade 3 of the clockwise one. +It records how the two runs of a **symmetric** comparison relate to each other, +which is how the implementation is verified. It is not a claim that these +channels change sign whenever the flag is set: in an ordinary simulation the +tower, support structure and inflow are not mirrored, so a quantity such as +``TwrBsMxt`` is simply the response of an unchanged structure to a +counter-clockwise rotor. + .. list-table:: :header-rows: 1 :widths: 20 80 @@ -278,13 +290,20 @@ the real wind rather than into its mirror image. .. _glue-code-mirror-rotor-asymmetric: -Inputs that are not mirrored ----------------------------- +Nothing outside the rotor is mirrored +------------------------------------- + +The flag reverses the **rotor**. It does not touch the environment, the control +setpoints, the support structure, or anything else that happens to be one-sided. +For ordinary use that is exactly what is wanted: a counter-clockwise rotor, on +the turbine and in the conditions you actually have. A real mooring spread, a +real wind field and a real yaw setpoint should all be left as they are. -The flag mirrors the **turbine**. It does not mirror the environment, the -control setpoints, or any other input that happens to be one-sided. Anything in -the list below is left exactly as written, and must be mirrored by hand if the -intent is to reproduce the mirror image of a clockwise simulation: +The list below matters only when **verifying** the implementation. That check +compares a clockwise run against a mirrored one and expects the two to be +reflections of each other, which requires the whole problem — not just the rotor +— to be symmetric about the rotor ``xz`` plane. For that comparison, and only +for it, these have to be mirrored by hand: - initial or fixed nacelle yaw (``NacYaw``) and the neutral yaw position (``YawNeut``); @@ -303,8 +322,8 @@ intent is to reproduce the mirror image of a clockwise simulation: verified against a mirror pair, however, because doing so requires mirroring the furl input file as well. -This matters most when verifying the mirror: leaving one of these unmirrored -looks exactly like a sign error in the code. +Leaving one of these unmirrored during a verification run looks exactly like a +sign error in the code, which is the only reason the list is written down. .. _glue-code-mirror-rotor-limits: From 54ba6f736cad23bc866d270f6cf721f6745e30c6 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Wed, 19 Aug 2026 14:12:23 -0600 Subject: [PATCH 29/66] Split the SimplifiedElastoDyn shaft-speed output aliases SED reported rotor speed and acceleration through one slot each, reached by both the rotor-convention names and the axis-suffixed ones. For a mirrored rotor those two families disagree in sign, so a single slot cannot serve both. RotSpeed and RotAcc keep the rotor's own convention, reading positive whenever the rotor turns its design direction. LSSTipV, LSSTipVxa, LSSTipVxs and the matching acceleration names now reach new slots holding the physical component about the shaft x axis. This is the same split already applied to ElastoDyn. RotTorq and LSShftTq are deliberately left sharing a slot, matching the judgement made for ElastoDyn: a torque name with no axis suffix follows the rotor convention. For a clockwise rotor every one of these reduces to the same value, so no existing model or output file changes. Co-authored-by: GitHub Copilot Co-authored-by: Claude Opus 5 Co-authored-by: Claude Haiku 4.5 --- modules/simple-elastodyn/src/SED_IO.f90 | 8 ++++++-- modules/simple-elastodyn/src/SED_Output_Params.f90 | 6 +++++- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/modules/simple-elastodyn/src/SED_IO.f90 b/modules/simple-elastodyn/src/SED_IO.f90 index 3931cb27d5..6114d63bfd 100644 --- a/modules/simple-elastodyn/src/SED_IO.f90 +++ b/modules/simple-elastodyn/src/SED_IO.f90 @@ -323,6 +323,10 @@ subroutine Calc_WriteOutput( u, p, x, dxdt, y, m, ErrStat, ErrMsg, CalcWriteOutp m%AllOuts( RotAcc ) = p%RotDir * dxdt%QDT(DOF_Az) * RPS2RPM m%AllOuts( GenAcc ) = p%RotDir * dxdt%QDT(DOF_Az) * RPS2RPM * p%GBoxRatio + ! MirrorRotor: physical components about the shaft x axis, which do change sign. + m%AllOuts( LSSTipVxa ) = x%QDT(DOF_Az) * RPS2RPM + m%AllOuts( LSSTipAxa ) = dxdt%QDT(DOF_Az) * RPS2RPM + ! Yaw commands m%AllOuts( Yaw ) = y%Yaw * R2D m%AllOuts( YawRate ) = y%YawRate * R2D @@ -381,8 +385,8 @@ SUBROUTINE SetOutParam(OutList, p, ErrStat, ErrMsg ) "YAWRATE "/) INTEGER(IntKi), PARAMETER :: ParamIndxAry(25) = (/ & ! This lists the index into AllOuts(:) of the allowed parameters ValidParamAry(:) Azimuth , BlPitch1 , BlPitch2 , BlPitch3 , BlPitch1 , BlPitch2 , BlPitch3 , GenAcc , & - GenSpeed , GenAcc , GenSpeed , RotPwr , RotTorq , RotAcc , RotAcc , RotAcc , & - RotSpeed , RotSpeed , RotSpeed , RotAcc , RotPwr , RotSpeed , RotTorq , Yaw , & + GenSpeed , GenAcc , GenSpeed , RotPwr , RotTorq , LSSTipAxa , LSSTipAxa , LSSTipAxa , & + LSSTipVxa , LSSTipVxa , LSSTipVxa , RotAcc , RotPwr , RotSpeed , RotTorq , Yaw , & YawRate /) CHARACTER(ChanLen), PARAMETER :: ParamUnitsAry(25) = (/ & ! This lists the units corresponding to the allowed parameters "(deg) ","(deg) ","(deg) ","(deg) ","(deg) ","(deg) ","(deg) ","(deg/s^2)", & diff --git a/modules/simple-elastodyn/src/SED_Output_Params.f90 b/modules/simple-elastodyn/src/SED_Output_Params.f90 index 7d64c07ea0..153bb4edc3 100644 --- a/modules/simple-elastodyn/src/SED_Output_Params.f90 +++ b/modules/simple-elastodyn/src/SED_Output_Params.f90 @@ -43,9 +43,13 @@ module SED_Output_Params INTEGER(IntKi), PARAMETER :: RotTorq = 11 INTEGER(IntKi), PARAMETER :: RotPwr = 12 + ! MirrorRotor: physical components about the shaft x axis, as opposed to the + ! rotor-convention RotSpeed and RotAcc above. + INTEGER(IntKi), PARAMETER :: LSSTipVxa = 13 + INTEGER(IntKi), PARAMETER :: LSSTipAxa = 14 ! The maximum number of output channels which can be output by the code. - INTEGER(IntKi), PARAMETER :: MaxOutPts = 12 + INTEGER(IntKi), PARAMETER :: MaxOutPts = 14 !End of code generated by Matlab script ! =================================================================================================== From b8be322609d8b299e728b1e003b0ba157872ed0e Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Wed, 19 Aug 2026 14:55:16 -0600 Subject: [PATCH 30/66] Report the SimplifiedElastoDyn rotor speed as a physical quantity SED handed out its rotor speed already converted to the rotor's own convention, while ElastoDyn hands out the physical value. Two consumers read it, and they disagreed about which they wanted: ServoDyn expects the clockwise convention, and AeroDisk was receiving the clockwise value from SED but the physical value from ElastoDyn. No single correction inside AeroDisk could have served both. y%RotSpeed is now the physical shaft speed, matching ElastoDyn, and the ServoDyn boundary converts it exactly as the ElastoDyn boundary already does. Both structural modules now hand AeroDisk the same thing. The write-output channels are unaffected: they are computed from the states directly and already carry the split between the rotor-convention and axis-suffixed names. Co-authored-by: GitHub Copilot Co-authored-by: Claude Opus 5 --- modules/openfast-library/src/FAST_Mapping.f90 | 8 ++++++-- modules/simple-elastodyn/src/SED.f90 | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/modules/openfast-library/src/FAST_Mapping.f90 b/modules/openfast-library/src/FAST_Mapping.f90 index 8931cb40fd..1a743513dc 100644 --- a/modules/openfast-library/src/FAST_Mapping.f90 +++ b/modules/openfast-library/src/FAST_Mapping.f90 @@ -3626,6 +3626,10 @@ subroutine Custom_InputSolve(Mapping, ModSrc, ModDst, iInput, T, ErrStat, ErrMsg case (Custom_SED_to_SrvD) + ! MirrorRotor: as for ElastoDyn, ServoDyn is handed the clockwise convention. + RotDir = 1.0_ReKi + if (T%p_FAST%MirrorRotor(ModDst%iRotor)) RotDir = -1.0_ReKi + ! 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) @@ -3633,9 +3637,9 @@ subroutine Custom_InputSolve(Mapping, ModSrc, ModDst, iInput, T, ErrStat, ErrMsg ! 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)%LSS_Spd = RotDir*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)%RotSpeed = RotDir*T%SED%y%RotSpeed T%SrvD%Input(iInput,ModDst%Ins)%BlPitch = T%SED%y%BlPitch ! root moments diff --git a/modules/simple-elastodyn/src/SED.f90 b/modules/simple-elastodyn/src/SED.f90 index aa5749a851..4233729f97 100644 --- a/modules/simple-elastodyn/src/SED.f90 +++ b/modules/simple-elastodyn/src/SED.f90 @@ -1432,7 +1432,7 @@ SUBROUTINE SED_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, ! convention, so a mirrored rotor turning its design direction still reads positive. y%LSSTipPxa = p%RotDir * x%QT( DOF_Az) call Zero2TwoPi(y%LSSTipPxa) ! Modulo - y%RotSpeed = p%RotDir * x%QDT(DOF_Az) + y%RotSpeed = x%QDT(DOF_Az) y%HSS_Spd = p%RotDir * x%QDT(DOF_Az) * p%GBoxRatio ! Rotor torque is the torque applied to the LSS shaft by the rotor. ! NOTE: this is equivalent to the reactionary torque of the generator due to its torque and inertia. From de74386b74b0dc7aca694deb0bc9822acb56e2c9 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Wed, 19 Aug 2026 14:55:39 -0600 Subject: [PATCH 31/66] Mirror the AeroDisk rotor and enable SED and AeroDisk AeroDisk had no notion of rotation direction at all. Its aero table is defined in the clockwise convention, so the rotor speed is converted to that convention before the table is read, which keeps the tip-speed ratio positive and inside the tabulated range. The coefficients that come back are reflected as they become physical loads: force is a true vector and moment a pseudovector, so different components change sign. C_F and C_M themselves are left in the table's convention, which makes the Ct and Cq outputs read in the rotor's own convention while the resulting forces and moments read physically, with no further work. Cp and the power are products of two flipped quantities and are unaffected. The skew-aligned triad also needed a correction. Its third axis is built from a cross product of two true vectors, which is a pseudovector, so on a mirrored rotor the triad came out left-handed. This is the same error already fixed in AeroDyn's disk-average frame. Note that it is not exercised by the regression case added here, which is unyawed, so the out-of-plane force and moment components are identically zero. SimplifiedElastoDyn was never handed the flag through the glue code at all, only through its standalone driver. Both it and AeroDisk are wired up here and their restrictions removed. Co-authored-by: GitHub Copilot Co-authored-by: Claude Opus 5 Co-authored-by: Gemini 3.6 Flash --- modules/aerodisk/src/AeroDisk.f90 | 23 +++++++++++++++++----- modules/aerodisk/src/AeroDisk_IO.f90 | 2 ++ modules/aerodisk/src/AeroDisk_Registry.txt | 2 ++ modules/aerodisk/src/AeroDisk_Types.f90 | 8 ++++++++ modules/openfast-library/src/FAST_Subs.f90 | 4 ++-- 5 files changed, 32 insertions(+), 7 deletions(-) diff --git a/modules/aerodisk/src/AeroDisk.f90 b/modules/aerodisk/src/AeroDisk.f90 index da72cbc5a5..1e37224799 100644 --- a/modules/aerodisk/src/AeroDisk.f90 +++ b/modules/aerodisk/src/AeroDisk.f90 @@ -488,7 +488,10 @@ SUBROUTINE ADsk_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg if (EqualRealNos(m%VRel_xd,0.0_SiKi)) then m%lambda = 0.0_SiKi else - m%lambda = real((u%RotSpeed * p%RotorRad),SiKi) / abs(m%VRel_xd) + ! MirrorRotor: the rotor speed arrives physical, and the table is defined in the + ! clockwise convention, so feed it the clockwise value to keep the tip-speed ratio + ! positive and inside the tabulated range. + m%lambda = real((p%RotDir * u%RotSpeed * p%RotorRad),SiKi) / abs(m%VRel_xd) endif if (EqualRealNos(m%VRel,0.0_SiKi)) then m%Chi = 0.0_SiKi @@ -518,7 +521,9 @@ SUBROUTINE ADsk_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg else m%x_hat = x_hatDisk m%y_hat = tmp3 / tmp1 - m%z_hat = cross_product( VRel_vec, x_hatDisk ) / tmp1 + ! MirrorRotor: a cross product of two true vectors is a pseudovector, so without + ! this the skew-aligned triad comes out left-handed on a mirrored rotor. + m%z_hat = p%RotDir * cross_product( VRel_vec, x_hatDisk ) / tmp1 endif !--------------- @@ -533,7 +538,7 @@ SUBROUTINE ADsk_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg !------------------------------------------- !> Interpolate Force and Moment coefficients - call ADskTableInterp(p%AeroTable, p%UseTSR, m%lambda, real(u%RotSpeed,SiKi), m%VRel_xd, real(u%BlPitch,SiKi), m%Chi, m%idx_last, m%C_F, m%C_M, ErrStat2, ErrMsg2) + call ADskTableInterp(p%AeroTable, p%UseTSR, m%lambda, real(p%RotDir*u%RotSpeed,SiKi), m%VRel_xd, real(u%BlPitch,SiKi), m%Chi, m%idx_last, m%C_F, m%C_M, ErrStat2, ErrMsg2) if (Failed()) return !> Apply skew if not in table @@ -553,9 +558,17 @@ SUBROUTINE ADsk_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg !! - \f$ M_x = \frac{1}{2} \rho A \left( V_\textrm{rel,x} \right)^2 * C_\textrm{M,x}\left(\text{TSR}@\lambda,\text{RtSpd}@\Omega,\text{V}_\text{rel}@V_\textrm{rel},\text{Pitch}@\theta,\text{Skew}@\chi\right) \f$ !! - \f$ M_y = \frac{1}{2} \rho A \left( V_\textrm{rel,x} \right)^2 * C_\textrm{M,y}\left(\text{TSR}@\lambda,\text{RtSpd}@\Omega,\text{V}_\text{rel}@V_\textrm{rel},\text{Pitch}@\theta,\text{Skew}@\chi\right) \f$ !! - \f$ M_z = \frac{1}{2} \rho A \left( V_\textrm{rel,x} \right)^2 * C_\textrm{M,z}\left(\text{TSR}@\lambda,\text{RtSpd}@\Omega,\text{V}_\text{rel}@V_\textrm{rel},\text{Pitch}@\theta,\text{Skew}@\chi\right) \f$ + ! MirrorRotor: the coefficients come out of the table in the clockwise convention and + ! are reflected here as they become physical loads. Force is a true vector and moment a + ! pseudovector, so different components change sign. C_F and C_M are left alone, since + ! the Ct and Cq outputs report the rotor's own convention. tmp1 = real(p%halfRhoA,SiKi) * m%VRel_xd * m%VRel_xd - m%Force(1:3) = tmp1 * m%C_F(1:3) - m%Moment(1:3) = tmp1 * real(p%RotorRad,SiKi) * m%C_M(1:3) + m%Force(1) = tmp1 * m%C_F(1) + m%Force(2) = tmp1 * m%C_F(2) * real(p%RotDir,SiKi) + m%Force(3) = tmp1 * m%C_F(3) + m%Moment(1) = tmp1 * real(p%RotorRad,SiKi) * m%C_M(1) * real(p%RotDir,SiKi) + m%Moment(2) = tmp1 * real(p%RotorRad,SiKi) * m%C_M(2) + m%Moment(3) = tmp1 * real(p%RotorRad,SiKi) * m%C_M(3) * real(p%RotDir,SiKi) diff --git a/modules/aerodisk/src/AeroDisk_IO.f90 b/modules/aerodisk/src/AeroDisk_IO.f90 index 997edf8f0c..64906e2115 100644 --- a/modules/aerodisk/src/AeroDisk_IO.f90 +++ b/modules/aerodisk/src/AeroDisk_IO.f90 @@ -745,6 +745,8 @@ subroutine ADskInput_SetParameters( InitInp, Interval, InputFileData, p, ErrStat p%RotorRad = InputFileData%RotorRad p%AirDens = InputFileData%AirDens p%UseTSR = .false. ! Reset below if N_TSR>1 + p%RotDir = 1.0_ReKi + if (InitInp%MirrorRotor) p%RotDir = -1.0_ReKi ! Derived parameter p%halfRhoA = 0.5_ReKi * p%AirDens * Pi * p%RotorRad*p%RotorRad diff --git a/modules/aerodisk/src/AeroDisk_Registry.txt b/modules/aerodisk/src/AeroDisk_Registry.txt index 990dfbaafd..39fdf62990 100644 --- a/modules/aerodisk/src/AeroDisk_Registry.txt +++ b/modules/aerodisk/src/AeroDisk_Registry.txt @@ -56,6 +56,7 @@ typedef ^ InitInputType ReKi HubPosition {3} - typedef ^ InitInputType R8Ki HubOrientation {3}{3} - - "Hub orientation" - typedef ^ InitInputType ReKi defAirDens - - - "Default atmospheric density from the driver; may be overwritten" "kg/m^3" typedef ^ InitInputType LOGICAL Linearize - .false. - "this module cannot be linearized at present" - +typedef ^ InitInputType LOGICAL MirrorRotor - .false. - "Flag indicating the rotor rotation direction is mirrored (counter-clockwise viewed from upwind)" - typedef ^ InitInputType LOGICAL UseInputFile - .TRUE. - "Supplied by Driver: .TRUE. if using a input file, .FALSE. if all inputs are being passed in by the caller" - typedef ^ InitInputType FileInfoType PassedFileData - - - "If we don't use the input file, pass everything through this" - typedef ^ InitInputType FlowFieldType *FlowField - - - "Pointer of InflowWinds flow field data type" - @@ -115,6 +116,7 @@ typedef ^ ParameterType IntKi NumOuts - - typedef ^ ParameterType ReKi halfRhoA - - - "half air density times rotor swept area" "kg/m" typedef ^ ParameterType ADsk_AeroTable AeroTable - - - "Data table" - typedef ^ ParameterType LOGICAL UseTSR - .false. - "Use TSR values from table instead of VRel + RtSpd" - +typedef ^ ParameterType ReKi RotDir - 1.0 - "Rotation direction: +1 normal, -1 for a mirrored rotor" - typedef ^ ParameterType OutParmType OutParam {:} - - "Names and units (and other characteristics) of all requested output parameters" - typedef ^ ParameterType FlowFieldType *FlowField - - - "Pointer of InflowWinds flow field data type" - typedef ^ ParameterType ReKi DiskWindPosRel {:}{:} - - "Disk locations for sampling to get disk avarage velocity (relative to hub)" m diff --git a/modules/aerodisk/src/AeroDisk_Types.f90 b/modules/aerodisk/src/AeroDisk_Types.f90 index 6113bb03c2..8d53961f4c 100644 --- a/modules/aerodisk/src/AeroDisk_Types.f90 +++ b/modules/aerodisk/src/AeroDisk_Types.f90 @@ -76,6 +76,7 @@ MODULE AeroDisk_Types REAL(R8Ki) , DIMENSION(1:3,1:3) :: HubOrientation = 0.0_R8Ki !< Hub orientation [-] REAL(ReKi) :: defAirDens = 0.0_ReKi !< Default atmospheric density from the driver; may be overwritten [kg/m^3] LOGICAL :: Linearize = .false. !< this module cannot be linearized at present [-] + LOGICAL :: MirrorRotor = .false. !< Flag indicating the rotor rotation direction is mirrored (counter-clockwise viewed from upwind) [-] LOGICAL :: UseInputFile = .TRUE. !< Supplied by Driver: .TRUE. if using a input file, .FALSE. if all inputs are being passed in by the caller [-] TYPE(FileInfoType) :: PassedFileData !< If we don't use the input file, pass everything through this [-] TYPE(FlowFieldType) , POINTER :: FlowField => NULL() !< Pointer of InflowWinds flow field data type [-] @@ -139,6 +140,7 @@ MODULE AeroDisk_Types REAL(ReKi) :: halfRhoA = 0.0_ReKi !< half air density times rotor swept area [kg/m] TYPE(ADsk_AeroTable) :: AeroTable !< Data table [-] LOGICAL :: UseTSR = .false. !< Use TSR values from table instead of VRel + RtSpd [-] + REAL(ReKi) :: RotDir = 1.0 !< Rotation direction: +1 normal, -1 for a mirrored rotor [-] TYPE(OutParmType) , DIMENSION(:), ALLOCATABLE :: OutParam !< Names and units (and other characteristics) of all requested output parameters [-] TYPE(FlowFieldType) , POINTER :: FlowField => NULL() !< Pointer of InflowWinds flow field data type [-] REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: DiskWindPosRel !< Disk locations for sampling to get disk avarage velocity (relative to hub) [m] @@ -530,6 +532,7 @@ subroutine ADsk_CopyInitInput(SrcInitInputData, DstInitInputData, CtrlCode, ErrS DstInitInputData%HubOrientation = SrcInitInputData%HubOrientation DstInitInputData%defAirDens = SrcInitInputData%defAirDens DstInitInputData%Linearize = SrcInitInputData%Linearize + DstInitInputData%MirrorRotor = SrcInitInputData%MirrorRotor DstInitInputData%UseInputFile = SrcInitInputData%UseInputFile call NWTC_Library_CopyFileInfoType(SrcInitInputData%PassedFileData, DstInitInputData%PassedFileData, CtrlCode, ErrStat2, ErrMsg2) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) @@ -564,6 +567,7 @@ subroutine ADsk_PackInitInput(RF, Indata) call RegPack(RF, InData%HubOrientation) call RegPack(RF, InData%defAirDens) call RegPack(RF, InData%Linearize) + call RegPack(RF, InData%MirrorRotor) call RegPack(RF, InData%UseInputFile) call NWTC_Library_PackFileInfoType(RF, InData%PassedFileData) call RegPack(RF, associated(InData%FlowField)) @@ -593,6 +597,7 @@ subroutine ADsk_UnPackInitInput(RF, OutData) call RegUnpack(RF, OutData%HubOrientation); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%defAirDens); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%Linearize); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%MirrorRotor); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%UseInputFile); if (RegCheckErr(RF, RoutineName)) return call NWTC_Library_UnpackFileInfoType(RF, OutData%PassedFileData) ! PassedFileData if (associated(OutData%FlowField)) deallocate(OutData%FlowField) @@ -1021,6 +1026,7 @@ subroutine ADsk_CopyParam(SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg) call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName) if (ErrStat >= AbortErrLev) return DstParamData%UseTSR = SrcParamData%UseTSR + DstParamData%RotDir = SrcParamData%RotDir if (allocated(SrcParamData%OutParam)) then LB(1:1) = lbound(SrcParamData%OutParam) UB(1:1) = ubound(SrcParamData%OutParam) @@ -1096,6 +1102,7 @@ subroutine ADsk_PackParam(RF, Indata) call RegPack(RF, InData%halfRhoA) call ADsk_PackAeroTable(RF, InData%AeroTable) call RegPack(RF, InData%UseTSR) + call RegPack(RF, InData%RotDir) call RegPack(RF, allocated(InData%OutParam)) if (allocated(InData%OutParam)) then call RegPackBounds(RF, 1, lbound(InData%OutParam), ubound(InData%OutParam)) @@ -1135,6 +1142,7 @@ subroutine ADsk_UnPackParam(RF, OutData) call RegUnpack(RF, OutData%halfRhoA); if (RegCheckErr(RF, RoutineName)) return call ADsk_UnpackAeroTable(RF, OutData%AeroTable) ! AeroTable call RegUnpack(RF, OutData%UseTSR); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%RotDir); if (RegCheckErr(RF, RoutineName)) return if (allocated(OutData%OutParam)) deallocate(OutData%OutParam) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return if (IsAllocAssoc) then diff --git a/modules/openfast-library/src/FAST_Subs.f90 b/modules/openfast-library/src/FAST_Subs.f90 index 6363077105..7aba321103 100644 --- a/modules/openfast-library/src/FAST_Subs.f90 +++ b/modules/openfast-library/src/FAST_Subs.f90 @@ -311,6 +311,7 @@ SUBROUTINE FAST_InitializeAll( t_initial, m_Glue, p_FAST, y_FAST, m_FAST, ED, SE Init%InData_SED%Linearize = p_FAST%Linearize Init%InData_SED%InputFile = p_FAST%EDFile(1) Init%InData_SED%RootName = TRIM(p_FAST%OutFileRoot)//'.'//TRIM(y_FAST%Module_Abrev(Module_SED)) + Init%InData_SED%MirrorRotor = p_FAST%MirrorRotor(1) ! Call module initialization routine dt_module = p_FAST%DT @@ -761,6 +762,7 @@ SUBROUTINE FAST_InitializeAll( t_initial, m_Glue, p_FAST, y_FAST, m_FAST, ED, SE Init%InData_ADsk%InputFile = p_FAST%AeroFile Init%InData_ADsk%RootName = p_FAST%OutFileRoot + Init%InData_ADsk%MirrorRotor = p_FAST%MirrorRotor(1) ! NOTE: cone angle is not included in the RotorRad calculation!!! if (p_FAST%CompElast == Module_SED) then @@ -2215,8 +2217,6 @@ SUBROUTINE ValidateInputData(p, m_FAST, ErrStat, ErrMsg) if (any(p%MirrorRotor)) then if (p%Linearize) CALL SetErrStat( ErrID_Fatal, 'MirrorRotor is not yet supported with linearization.', ErrStat, ErrMsg, RoutineName ) if (p%CompAeroMaps) CALL SetErrStat( ErrID_Fatal, 'MirrorRotor is not yet supported with the steady-state (aero map) solver.', ErrStat, ErrMsg, RoutineName ) - if (p%CompElast == Module_SED) CALL SetErrStat( ErrID_Fatal, 'MirrorRotor is not yet supported with SimplifiedElastoDyn.', ErrStat, ErrMsg, RoutineName ) - if (p%CompAero == Module_ADsk) CALL SetErrStat( ErrID_Fatal, 'MirrorRotor is not yet supported with AeroDisk.', ErrStat, ErrMsg, RoutineName ) if (p%CompAero == Module_ExtLd) CALL SetErrStat( ErrID_Fatal, 'MirrorRotor is not yet supported with ExtLoads.', ErrStat, ErrMsg, RoutineName ) end if end if From dbd8e0a5cf270cfb596aa1b147b30338198c7abc Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Wed, 19 Aug 2026 14:55:59 -0600 Subject: [PATCH 32/66] Register the mirrored AeroDisk and SimplifiedElastoDyn case Adds 5MW_Land_DLL_WTurb_ADsk_SED_MirrorRotor under the mirrorrotor label, completing mirrored-rotor coverage of the second structural and aerodynamic path. Co-authored-by: GitHub Copilot Co-authored-by: Claude Opus 5 Co-authored-by: Claude Haiku 4.5 --- reg_tests/CTestList.cmake | 1 + reg_tests/r-test | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/reg_tests/CTestList.cmake b/reg_tests/CTestList.cmake index a4775970cd..add8d9bce2 100644 --- a/reg_tests/CTestList.cmake +++ b/reg_tests/CTestList.cmake @@ -387,6 +387,7 @@ of_regression("Tailfin_FreeYaw1DOF_PolarBased" "openfast;elastodyn;aerod of_regression("Tailfin_FreeYaw1DOF_Unsteady" "openfast;elastodyn;aerodyn") 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_ADsk_SED_MirrorRotor" "openfast;simple-elastodyn;aerodisk;mirrorrotor") 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") diff --git a/reg_tests/r-test b/reg_tests/r-test index 085a34c9f6..c67a5d84d7 160000 --- a/reg_tests/r-test +++ b/reg_tests/r-test @@ -1 +1 @@ -Subproject commit 085a34c9f6f141c595fb34deb679c7b8abcd3bfe +Subproject commit c67a5d84d7c294b12daa816926c776cd2ddaf677 From cee4a162be39efb4ab6d4b9c704e435dcc3c84b8 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Wed, 19 Aug 2026 15:40:47 -0600 Subject: [PATCH 33/66] Mirror the AeroDyn nodal output channels The nodal outputs are a third copy of the blade output block, alongside the one in AeroDyn_IO.f90 and the free-wake copy beside it. Only the first was mirrored in phase 1, so a mirrored rotor reported nodal lift, drag, normal and tangential force, and the y-direction coefficients and induction, in a mixture of frames. The error was invisible to every test written so far. The nodal channels are named AB1N001Fd where the module channels are B1N001Fd, and no mirrored test requested the nodal form. It was caught by running one clockwise and one mirrored rotor inside a single driver run and comparing them: the angle of attack agreed exactly, so the momentum solution was right, but the lift and drag split was rotated by twice the inflow angle, with the magnitude preserved. The same sign map as AeroDyn_IO.f90 is applied. The free-wake branches are left alone deliberately: there m%Y and the inflow angle both come from the wake solution in the same frame, so those expressions are already self-consistent. Mirroring that path means converting its loads and its outputs together, along with the wake itself, and is not attempted here. Co-authored-by: GitHub Copilot Co-authored-by: Claude Opus 5 Co-authored-by: Claude Sonnet 4.5 Co-authored-by: Claude Haiku 4.5 --- .../aerodyn/src/AeroDyn_AllBldNdOuts_IO.f90 | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/modules/aerodyn/src/AeroDyn_AllBldNdOuts_IO.f90 b/modules/aerodyn/src/AeroDyn_AllBldNdOuts_IO.f90 index 240a07ffe9..65e5dcd215 100644 --- a/modules/aerodyn/src/AeroDyn_AllBldNdOuts_IO.f90 +++ b/modules/aerodyn/src/AeroDyn_AllBldNdOuts_IO.f90 @@ -432,7 +432,7 @@ SUBROUTINE Calc_WriteAllBldNdOutput( p, p_AD, u, m, m_AD, x, y, OtherState, RotI if (p_AD%Wake_Mod /= WakeMod_FVW) then DO iB=1,nB do iNdL=1,nNd; iNd=Nd(iNdL); - y%WriteOutput(iOut) = m%BEMT_u(Indx)%Vy(iNd,iB) * m%BEMT_y%tanInduction(iNd,iB) + y%WriteOutput(iOut) = p%RotDir * m%BEMT_u(Indx)%Vy(iNd,iB) * m%BEMT_y%tanInduction(iNd,iB) iOut = iOut + 1 END DO END DO @@ -731,7 +731,7 @@ SUBROUTINE Calc_WriteAllBldNdOutput( p, p_AD, u, m, m_AD, x, y, OtherState, RotI if (p_AD%Wake_Mod /= WakeMod_FVW) then DO iB=1,nB do iNdL=1,nNd; iNd=Nd(iNdL); - y%WriteOutput(iOut) = m%BEMT_y%Cm(iNd,iB) + y%WriteOutput(iOut) = p%RotDir * m%BEMT_y%Cm(iNd,iB) iOut = iOut + 1 END DO END DO @@ -769,7 +769,7 @@ SUBROUTINE Calc_WriteAllBldNdOutput( p, p_AD, u, m, m_AD, x, y, OtherState, RotI if (p_AD%Wake_Mod /= WakeMod_FVW) then DO iB=1,nB do iNdL=1,nNd; iNd=Nd(iNdL); - y%WriteOutput(iOut) = m%BEMT_y%Cy(iNd,iB) + y%WriteOutput(iOut) = p%RotDir * m%BEMT_y%Cy(iNd,iB) iOut = iOut + 1 END DO END DO @@ -812,7 +812,7 @@ SUBROUTINE Calc_WriteAllBldNdOutput( p, p_AD, u, m, m_AD, x, y, OtherState, RotI do iNdL=1,nNd; iNd=Nd(iNdL); ct=cos(m%BEMT_u(Indx)%theta(iNd,iB)) st=sin(m%BEMT_u(Indx)%theta(iNd,iB)) - y%WriteOutput(iOut) = -m%BEMT_y%Cx(iNd,iB)*st + m%BEMT_y%Cy(iNd,iB)*ct + y%WriteOutput(iOut) = p%RotDir * (-m%BEMT_y%Cx(iNd,iB)*st + m%BEMT_y%Cy(iNd,iB)*ct) iOut = iOut + 1 END DO END DO @@ -830,13 +830,15 @@ SUBROUTINE Calc_WriteAllBldNdOutput( p, p_AD, u, m, m_AD, x, y, OtherState, RotI ! Lift force, drag force, pitching moment + ! MirrorRotor: m%X and m%Y are in the mirrored frame while phi and theta are the + ! CW-equivalent BEMT values, so the y-component is converted back before combining. CASE ( BldNd_Fl ) if (p_AD%Wake_Mod /= WakeMod_FVW) then DO iB=1,nB do iNdL=1,nNd; iNd=Nd(iNdL); cp=cos(m%BEMT_y%phi(iNd,iB)) sp=sin(m%BEMT_y%phi(iNd,iB)) - y%WriteOutput(iOut) = m%X(iNd,iB)*cp - m%Y(iNd,iB)*sp + y%WriteOutput(iOut) = m%X(iNd,iB)*cp - p%RotDir*m%Y(iNd,iB)*sp iOut = iOut + 1 END DO END DO @@ -858,7 +860,7 @@ SUBROUTINE Calc_WriteAllBldNdOutput( p, p_AD, u, m, m_AD, x, y, OtherState, RotI do iNdL=1,nNd; iNd=Nd(iNdL); cp=cos(m%BEMT_y%phi(iNd,iB)) sp=sin(m%BEMT_y%phi(iNd,iB)) - y%WriteOutput(iOut) = m%X(iNd,iB)*sp + m%Y(iNd,iB)*cp + y%WriteOutput(iOut) = m%X(iNd,iB)*sp + p%RotDir*m%Y(iNd,iB)*cp iOut = iOut + 1 END DO END DO @@ -889,7 +891,7 @@ SUBROUTINE Calc_WriteAllBldNdOutput( p, p_AD, u, m, m_AD, x, y, OtherState, RotI do iNdL=1,nNd; iNd=Nd(iNdL); ct=cos(m%BEMT_u(Indx)%theta(iNd,iB)) st=sin(m%BEMT_u(Indx)%theta(iNd,iB)) - y%WriteOutput(iOut) = m%X(iNd,iB)*ct - m%Y(iNd,iB)*st + y%WriteOutput(iOut) = m%X(iNd,iB)*ct - p%RotDir*m%Y(iNd,iB)*st iOut = iOut + 1 END DO END DO @@ -912,7 +914,7 @@ SUBROUTINE Calc_WriteAllBldNdOutput( p, p_AD, u, m, m_AD, x, y, OtherState, RotI do iNdL=1,nNd; iNd=Nd(iNdL); ct=cos(m%BEMT_u(Indx)%theta(iNd,iB)) st=sin(m%BEMT_u(Indx)%theta(iNd,iB)) - y%WriteOutput(iOut) = -m%X(iNd,iB)*st - m%Y(iNd,iB)*ct + y%WriteOutput(iOut) = p%RotDir * (-m%X(iNd,iB)*st - p%RotDir*m%Y(iNd,iB)*ct) iOut = iOut + 1 END DO END DO From 0e9c49949e5e0cad65a7fa70eea146fa5ff23bf7 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Wed, 19 Aug 2026 16:30:01 -0600 Subject: [PATCH 34/66] Register the two-rotor counter-clockwise case Runs a clockwise and a counter-clockwise rotor in one driver run. This is the only mirrored case whose blade outputs are in the nodal form, and the two rotors can be compared against each other directly rather than only against a stored baseline. Co-authored-by: GitHub Copilot Co-authored-by: Claude Opus 5 Co-authored-by: Claude Sonnet 4.5 --- reg_tests/CTestList.cmake | 1 + reg_tests/r-test | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/reg_tests/CTestList.cmake b/reg_tests/CTestList.cmake index add8d9bce2..183315ad21 100644 --- a/reg_tests/CTestList.cmake +++ b/reg_tests/CTestList.cmake @@ -461,6 +461,7 @@ ad_regression("ad_EllipticalWingInf_OLAF" "aerodyn;bem") ad_regression("ad_HelicalWakeInf_OLAF" "aerodyn;bem") ad_regression("ad_Kite_OLAF" "aerodyn;bem") ad_regression("ad_MultipleHAWT" "aerodyn;bem") +ad_regression("ad_MultipleHAWT_MirrorRotor" "aerodyn;bem;mirrorrotor") ad_regression("ad_QuadRotor_OLAF" "aerodyn;bem") ad_regression("ad_VerticalAxis_OLAF" "aerodyn;bem") ad_regression("ad_MHK_RM1_Fixed" "aerodyn;bem;mhk") diff --git a/reg_tests/r-test b/reg_tests/r-test index c67a5d84d7..5deb7b9e26 160000 --- a/reg_tests/r-test +++ b/reg_tests/r-test @@ -1 +1 @@ -Subproject commit c67a5d84d7c294b12daa816926c776cd2ddaf677 +Subproject commit 5deb7b9e26dcd474bf06750c34cda3f6e163f5f4 From fbb8bd700ccd57efb210d147901fa5ccc62ffb23 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Wed, 19 Aug 2026 17:43:19 -0600 Subject: [PATCH 35/66] Register the twin-rotor counter-clockwise case A clockwise and a counter-clockwise rotor on one semisubmersible, which makes the whole system symmetric about the vertical plane. Rotor 2 mirrors rotor 1 within a single solve, so the drivetrain, substructure, moorings and two controller instances are all checked at once, with no run-to-run difference to explain away. Co-authored-by: GitHub Copilot Co-authored-by: Claude Opus 5 Co-authored-by: Claude Sonnet 4.5 --- reg_tests/CTestList.cmake | 1 + reg_tests/r-test | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/reg_tests/CTestList.cmake b/reg_tests/CTestList.cmake index 183315ad21..5302d9b4e3 100644 --- a/reg_tests/CTestList.cmake +++ b/reg_tests/CTestList.cmake @@ -368,6 +368,7 @@ of_regression("5MW_TLP_DLL_WTurb_WavesIrr_WavesMulti" "openfast;elastodyn;aerod 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_OC4Semi_WSt_WavesWN_MirrorRotor" "openfast;elastodyn;aerodyn;servodyn;hydrodyn;moordyn;offshore;mirrorrotor") +of_regression("5MW_MRSemi_DLL_WSt_WavesIrr_MirrorRotor" "openfast;elastodyn;aerodyn;servodyn;hydrodyn;subdyn;moordyn;offshore;mirrorrotor") 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_MirrorRotor" "openfast;beamdyn;aerodyn;servodyn;mirrorrotor") diff --git a/reg_tests/r-test b/reg_tests/r-test index 5deb7b9e26..2f09f39886 160000 --- a/reg_tests/r-test +++ b/reg_tests/r-test @@ -1 +1 @@ -Subproject commit 5deb7b9e26dcd474bf06750c34cda3f6e163f5f4 +Subproject commit 2f09f398868369749f5db1f803b1b79c456cf34d From ce3e2df77b71a7fda99cc462be8006e1013162ab Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Wed, 19 Aug 2026 19:36:47 -0600 Subject: [PATCH 36/66] Mirror the MHK centre-of-buoyancy offset BlCenBt is the chordwise offset of a blade section's centre of buoyancy, and it sits in the same in-plane direction as BlSwpAC, which is already mirrored two lines above. Leaving it alone put the buoyant load of a counter-clockwise MHK rotor on the wrong side of the blade. The neighbouring columns are correctly left alone. BlCenBn is the out-of-plane offset, which no more flips than curvature does. BlCpn, BlCpt, BlCan, BlCat and BlCam are dimensionless coefficients that end up scaling chord squared, so they carry no direction at all. Found by working through what a mirrored marine turbine would need, rather than by a failing test: buoyancy is computed only for MHK turbines, and no mirrored case is an MHK case. In the RM1 rotor BlSwpAC is zero at every station while BlCenBt is not, so the mirror that was present did nothing and the one that was missing did all the damage. Correcting it moves 116 of 184 channels, and the nodal buoyant moments by more than their own magnitude. Co-authored-by: GitHub Copilot Co-authored-by: Claude Opus 5 Co-authored-by: Claude Sonnet 4.5 --- modules/aerodyn/src/AeroDyn.f90 | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/aerodyn/src/AeroDyn.f90 b/modules/aerodyn/src/AeroDyn.f90 index 4f58429c6e..cb8a5e9a09 100644 --- a/modules/aerodyn/src/AeroDyn.f90 +++ b/modules/aerodyn/src/AeroDyn.f90 @@ -405,11 +405,13 @@ subroutine AD_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, InitOut ! MirrorRotor: mirror the blade geometry about the rotor XZ plane. Twist is a rotation ! about the span axis and sweep is the in-plane offset, so both flip; curvature (out of ! plane) does not. This must follow setCantAngle, which derives BlCrvAng from BlTwist. + ! BlCenBt is the MHK centre-of-buoyancy offset in the same in-plane direction as sweep. do iR = 1, nRotors if (.not. InitInp%rotors(iR)%MirrorRotor) cycle do I=1,NumBlades(iR) InputFileData%rotors(iR)%BladeProps(I)%BlTwist = -InputFileData%rotors(iR)%BladeProps(I)%BlTwist InputFileData%rotors(iR)%BladeProps(I)%BlSwpAC = -InputFileData%rotors(iR)%BladeProps(I)%BlSwpAC + InputFileData%rotors(iR)%BladeProps(I)%BlCenBt = -InputFileData%rotors(iR)%BladeProps(I)%BlCenBt end do end do From 53560e0c418da203f6902ce2b8543317a0b9fbd5 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Wed, 19 Aug 2026 19:42:28 -0600 Subject: [PATCH 37/66] Register the marine turbine mirror pair The only mirrored cases that reach the buoyancy calculation, and so the only regression cover for the centre-of-buoyancy mirror. Co-authored-by: GitHub Copilot Co-authored-by: Claude Opus 5 Co-authored-by: Claude Sonnet 4.5 --- reg_tests/CTestList.cmake | 2 ++ reg_tests/r-test | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/reg_tests/CTestList.cmake b/reg_tests/CTestList.cmake index 5302d9b4e3..4b9b6ff3ac 100644 --- a/reg_tests/CTestList.cmake +++ b/reg_tests/CTestList.cmake @@ -369,6 +369,8 @@ of_regression("5MW_OC3Spar_DLL_WTurb_WavesIrr" "openfast;elastodyn;aerod of_regression("5MW_OC4Semi_WSt_WavesWN" "openfast;elastodyn;aerodyn;servodyn;hydrodyn;moordyn;offshore") of_regression("5MW_OC4Semi_WSt_WavesWN_MirrorRotor" "openfast;elastodyn;aerodyn;servodyn;hydrodyn;moordyn;offshore;mirrorrotor") of_regression("5MW_MRSemi_DLL_WSt_WavesIrr_MirrorRotor" "openfast;elastodyn;aerodyn;servodyn;hydrodyn;subdyn;moordyn;offshore;mirrorrotor") +of_regression("MHK_RM1_Floating_Steady_CW" "openfast;elastodyn;aerodyn;hydrodyn;moordyn;offshore;mhk;mirrorrotor") +of_regression("MHK_RM1_Floating_Steady_MirrorRotor" "openfast;elastodyn;aerodyn;hydrodyn;moordyn;offshore;mhk;mirrorrotor") 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_MirrorRotor" "openfast;beamdyn;aerodyn;servodyn;mirrorrotor") diff --git a/reg_tests/r-test b/reg_tests/r-test index 2f09f39886..35c0569fe1 160000 --- a/reg_tests/r-test +++ b/reg_tests/r-test @@ -1 +1 @@ -Subproject commit 2f09f398868369749f5db1f803b1b79c456cf34d +Subproject commit 35c0569fe1247fbb15d02a789b16f7983e2ba5d6 From 84e60e11ee9fb01092433bab2c25dc863c8e21a0 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Wed, 19 Aug 2026 19:42:40 -0600 Subject: [PATCH 38/66] Update r-test for the OLAF note Co-authored-by: GitHub Copilot Co-authored-by: Claude Opus 5 --- 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 35c0569fe1..193f91c5ab 160000 --- a/reg_tests/r-test +++ b/reg_tests/r-test @@ -1 +1 @@ -Subproject commit 35c0569fe1247fbb15d02a789b16f7983e2ba5d6 +Subproject commit 193f91c5ab0caa58b8ce1daad24aa0e07d488e00 From d69cab274faebd2e91c013580d1ebd75ac8d3190 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Wed, 19 Aug 2026 21:05:15 -0600 Subject: [PATCH 39/66] Measure the sign table instead of asserting it The table claimed to be measured but had been maintained by hand, and had drifted. It said the AeroDyn Ft, Cy and Vindy families change sign, which was true of the module channels and false of the nodal ones until that path was mirrored. It also predated the marine turbine work, so nothing buoyant appeared at all. It is now generated by tools/emit_sign_table.py, which runs every registered mirrored case, compares each channel against its clockwise counterpart, and reports the observed behaviour. All five pairs resolve completely, so every family listed has been seen rather than reasoned about. The families that carry a sign in the code but that no registered case requests are called out separately as inferred rather than measured, since that gap is what allowed two sign errors to survive this long. Co-authored-by: GitHub Copilot Co-authored-by: Claude Opus 5 Co-authored-by: Claude Sonnet 4.5 --- docs/source/user/glue-code/mirror_rotor.rst | 71 +++++++++++++++------ 1 file changed, 52 insertions(+), 19 deletions(-) diff --git a/docs/source/user/glue-code/mirror_rotor.rst b/docs/source/user/glue-code/mirror_rotor.rst index 7d844c6714..f57ba57684 100644 --- a/docs/source/user/glue-code/mirror_rotor.rst +++ b/docs/source/user/glue-code/mirror_rotor.rst @@ -229,12 +229,17 @@ that both flip, and thrust is along the mirror axis. Measured sign table ------------------- -The table below is **measured**, not asserted. It is produced by running the -same model with ``MirrorRotor = F`` and ``MirrorRotor = T`` and comparing every -output channel. Note that mirroring reverses the order in which the blades -sweep past a given point, so under non-axisymmetric inflow — shear, yaw, or -shaft tilt — blade 2 of the mirrored rotor corresponds to blade 3 of the -clockwise one. +The table below is **measured**, not asserted. It is generated by running every +registered mirrored case and comparing each channel against its clockwise +counterpart, so it records behaviour that is actually observed rather than +behaviour that is expected from reading the code. The cases contributing to it +are the ElastoDyn + AeroDyn pair, the BeamDyn pair, the marine-turbine pair, the +two-rotor aerodynamic driver case and the twin-rotor semisubmersible. + +Note that mirroring reverses the order in which the blades sweep past a given +point, so under non-axisymmetric inflow — shear, yaw, or shaft tilt — blade 2 of +the mirrored rotor corresponds to blade 3 of the clockwise one. Mooring lines +exchange in the same way, and which line pairs with which depends on the layout. It records how the two runs of a **symmetric** comparison relate to each other, which is how the implementation is verified. It is not a claim that these @@ -251,25 +256,53 @@ counter-clockwise rotor. - Channels * - Identical - ``RotSpeed``, ``RotAccel``, ``Azimuth``, ``RotTorq``, ``LSShftTq``, - ``GenSpeed``, ``GenAccel``, ``HSShftTq``, ``HSShftPwr``, ``RotPwr``, - ``RotThrust``, ``LSShftFxa``, ``LSShftFza``, ``LSSTipMya``, - ``YawBrFxp``, ``YawBrFzp``, ``YawBrMyp``, ``TwrBsFxt``, ``TwrBsMyt``, - ``OoPDefl*``, ``TipDxc*``, ``TipDzc*``, ``RootFxc*``, ``RootFzc*``, - ``RootMyc*``, ``BldPitch*``, ``GenTq``, ``GenPwr``, ``HSSBrTq``, + ``RotPwr``, ``RotThrust``, ``GenSpeed``, ``GenAccel``, ``GenTq``, + ``GenPwr``, ``HSShftTq``, ``HSShftPwr``, ``LSShftFxa``, ``LSShftFza``, + ``LSSTipMya``, ``LSSGagMya``, ``YawBrFxp``, ``YawBrFzp``, ``YawBrMyp``, + ``TwrBsFxt``, ``TwrBsFzt``, ``TwrBsMyt``, ``TTDspFA``, ``TwrTpTDxi``, + ``TwrTpTDzi``, ``NcIMUTAxs``, ``NcIMUTAzs``, ``PtfmSurge``, + ``PtfmHeave``, ``PtfmPitch``, ``HydroFxi``, ``HydroFzi``, + ``OoPDefl*``, ``TipDxc*``, ``RootFxc*``, ``RootFzc*``, ``RootMyc*``, + ``RootFxb*``, ``RootFzb*``, ``RootMyb*``; the BeamDyn ``B*RootFxr``, ``B*RootFzr``, ``B*RootMyr``, ``B*TipTDxr``, - ``B*TipTDzr``, ``B*TipRDyr`` families, and the AeroDyn ``*Alpha``, - ``*Theta``, ``*Phi``, ``*Cl``, ``*Cd``, ``*Fn`` families + ``B*TipTDzr``, ``B*TipRDyr``, ``B*FldFz`` families; + the AeroDyn ``*Alpha``, ``*Theta``, ``*Fn``, ``*Fl``, ``*Fd``, + ``*Vrel``, ``*Vindx``, ``*AxInd``, ``*TnInd``, ``*Gam``, ``*VUndx``, + ``*VDisx`` families, in both the module (``B1N001Fn``) and nodal + (``AB1N001Fn``) forms; + ``RtAeroFxh``, ``RtAeroFzh``, ``RtAeroMyh``, ``RtAeroPwr``, + ``RtAeroCp``, ``RtAeroCt``, ``RtArea``, ``RtSkew``, ``RtTSR``, + ``RtSpeed``, ``RtVAvgxh``, ``RtVAvgzh``, ``RtFldFxh``, ``RtFldFzg``, + ``RtFldMyg``; and for a marine turbine the buoyant ``*Fbn``, ``*Fbs``, + ``*Mbt``, ``HbFbx``, ``HbFbz``, ``HbMby`` families together with + ``*SgCav``, ``*SigCr`` and ``*Clrnc`` * - Sign-flipped - - ``LSShftMxa``, ``LSSTipVxa``, ``LSSTipAxa``, ``LSSGagMxa``, - ``LSShftFya``, ``LSSTipMza``, ``YawBrFyp``, ``YawBrMxp``, ``YawBrMzp``, - ``TwrBsFyt``, ``TwrBsMxt``, ``TwrBsMzt``, ``IPDefl*``, ``TipDyc*``, - ``RootFyc*``, ``RootMxc*``, ``RootMzc*``, + - ``LSShftMxa``, ``LSShftFya``, ``LSSTipMza``, ``LSSGagMxa``, + ``LSSGagMza``, ``LSSTipVxa``, ``LSSTipAxa``, ``YawBrFyp``, + ``YawBrMxp``, ``YawBrMzp``, ``TwrBsFyt``, ``TwrBsMxt``, ``TwrBsMzt``, + ``TTDspSS``, ``TwrTpTDyi``, ``NcIMUTAys``, ``PtfmSway``, ``PtfmRoll``, + ``PtfmYaw``, ``HydroFyi``, + ``IPDefl*``, ``TipDyc*``, ``RootFyc*``, ``RootMxc*``, ``RootMzc*``, + ``RootFyb*``, ``RootMxb*``, ``RootMzb*``; the BeamDyn ``B*RootFyr``, ``B*RootMxr``, ``B*RootMzr``, ``B*TipTDyr``, - ``B*TipRDxr``, ``B*TipRDzr`` families, and the AeroDyn ``*Ft``, - ``*Cy``, ``*Vindy`` families + ``B*TipRDxr``, ``B*TipRDzr``, ``B*FldMx`` families; + the AeroDyn ``*Ft``, ``*Vindy``, ``*STVy``, ``*Mm`` families, again in + both the module and nodal forms; + ``RtAeroFyh``, ``RtAeroMxh``, ``RtAeroMzh``, ``RtAeroCq``, + ``RtVAvgyh``, ``RtFldFyh``, ``RtFldMxh``, ``RtFldMzh``; and for a + marine turbine the buoyant ``*Fbt``, ``*Mbn``, ``*Mbs``, ``HbFby``, + ``HbMbx``, ``HbMbz`` families * - Mirrored angle - ``LSSTipPxa``, ``LSSGagPxa`` +A few channels carry a sign change in the code but are not requested by any +registered mirrored case, so they do not appear above: the AeroDyn ``*Cy``, +``*Cm`` and ``*Ct`` coefficients, and the ``*Phi``, ``*Cl`` and ``*Cd`` families +that do not change. Their behaviour follows the same rule as the corresponding +force channels, but it is inferred rather than measured, and it should be +treated with more caution than the rest of the table. + + .. _glue-code-mirror-rotor-control: Controllers From 82db5da4dcc603b4d5e822cae424b6434f83d8e3 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Thu, 20 Aug 2026 17:50:31 -0600 Subject: [PATCH 40/66] Correct the mirrored AeroDisk force and moment signs The skew-aligned disk triad is built so that all three basis vectors mirror as true vectors, which is exactly what the RotDir on z_hat achieves: the cross product of two true vectors is a pseudovector, and the factor turns it back. Taking components against a triad that reflects with the flow, a true vector such as force keeps every component, because the vector and the basis vector reflect together, while a pseudovector such as moment reverses every one. The loads did not follow that rule. Force(2) carried a RotDir it should not, and Moment(2) lacked one it should have had. Both are only reachable when the coefficient table supplies lateral coefficients, which the shipped 5MW table does not, so neither had ever executed. Measured against the new yawed pair, the disk-frame forces are now identical between the clockwise and mirrored runs and the disk-frame moments are all sign-flipped, and in the inertial frame ADFyi, ADMxi and ADMzi flip while ADFxi, ADFzi and ADMyi do not. Before the change ADFyi came out identical, which is what a mirror image cannot do. Co-authored-by: Claude Opus 5 Co-authored-by: Claude Sonnet 4.5 --- modules/aerodisk/src/AeroDisk.f90 | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/modules/aerodisk/src/AeroDisk.f90 b/modules/aerodisk/src/AeroDisk.f90 index 1e37224799..f80da0d60a 100644 --- a/modules/aerodisk/src/AeroDisk.f90 +++ b/modules/aerodisk/src/AeroDisk.f90 @@ -559,15 +559,18 @@ SUBROUTINE ADsk_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg !! - \f$ M_y = \frac{1}{2} \rho A \left( V_\textrm{rel,x} \right)^2 * C_\textrm{M,y}\left(\text{TSR}@\lambda,\text{RtSpd}@\Omega,\text{V}_\text{rel}@V_\textrm{rel},\text{Pitch}@\theta,\text{Skew}@\chi\right) \f$ !! - \f$ M_z = \frac{1}{2} \rho A \left( V_\textrm{rel,x} \right)^2 * C_\textrm{M,z}\left(\text{TSR}@\lambda,\text{RtSpd}@\Omega,\text{V}_\text{rel}@V_\textrm{rel},\text{Pitch}@\theta,\text{Skew}@\chi\right) \f$ ! MirrorRotor: the coefficients come out of the table in the clockwise convention and - ! are reflected here as they become physical loads. Force is a true vector and moment a - ! pseudovector, so different components change sign. C_F and C_M are left alone, since - ! the Ct and Cq outputs report the rotor's own convention. + ! are reflected here as they become physical loads. The skew-aligned triad above is + ! built so that all three basis vectors mirror as true vectors, which is what the + ! RotDir on z_hat achieves. Taking components against that triad, a true vector such + ! as force keeps every component, since both the vector and the basis vector reflect + ! together, while a pseudovector such as moment reverses every one. C_F and C_M are + ! left alone, since the Ct and Cq outputs report the rotor's own convention. tmp1 = real(p%halfRhoA,SiKi) * m%VRel_xd * m%VRel_xd m%Force(1) = tmp1 * m%C_F(1) - m%Force(2) = tmp1 * m%C_F(2) * real(p%RotDir,SiKi) + m%Force(2) = tmp1 * m%C_F(2) m%Force(3) = tmp1 * m%C_F(3) m%Moment(1) = tmp1 * real(p%RotorRad,SiKi) * m%C_M(1) * real(p%RotDir,SiKi) - m%Moment(2) = tmp1 * real(p%RotorRad,SiKi) * m%C_M(2) + m%Moment(2) = tmp1 * real(p%RotorRad,SiKi) * m%C_M(2) * real(p%RotDir,SiKi) m%Moment(3) = tmp1 * real(p%RotorRad,SiKi) * m%C_M(3) * real(p%RotDir,SiKi) From e9fabf05586b725a056b161f5d3ce7a92c5101fb Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Thu, 20 Aug 2026 17:50:31 -0600 Subject: [PATCH 41/66] Fix the AeroDisk output coordinate transforms Rxyz holds x_hat, y_hat and z_hat as its columns. Multiplying it on the left of a vector rebuilds an inertial vector from disk components; multiplying on the right projects an inertial vector onto the disk axes. Both call sites used the wrong one, in opposite directions. The wind and structural velocity outputs hold an inertial vector and want its components, but reconstructed instead, which reduced ADVWindx/y/z to the shaft axis scaled by the wind speed. ADVWindz should be identically zero, since z_hat is built perpendicular to the relative wind, and instead read 2.04 m/s in the case used here. It is now zero exactly. The load outputs hold disk components and want an inertial vector, and projected instead. The moment block additionally reconstructed from m%Force, so ADMxi, ADMyi and ADMzi were copies of ADFxi, ADFyi and ADFzi rather than moments at all. This predates the counter-clockwise rotor work and is not caused by it, but the mirror comparison is what exposed it: the affected channels could not be made to resolve, because the quantities themselves were not what their names claimed. Co-authored-by: Claude Opus 5 Co-authored-by: Claude Sonnet 4.5 --- modules/aerodisk/src/AeroDisk_IO.f90 | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/modules/aerodisk/src/AeroDisk_IO.f90 b/modules/aerodisk/src/AeroDisk_IO.f90 index 64906e2115..ee6fa238a6 100644 --- a/modules/aerodisk/src/AeroDisk_IO.f90 +++ b/modules/aerodisk/src/AeroDisk_IO.f90 @@ -904,8 +904,10 @@ subroutine Calc_WriteOutput( u, p, y, m, ErrStat, ErrMsg, CalcWriteOutput ) m%AllOuts( ADVRel ) = real(m%VRel, ReKi) ! magnitude of VRel vector (m/s) m%AllOuts( ADSkew ) = real(m%Chi * 180.0_ReKi / Pi, ReKi) - ! Wind in local frame, inertial frame - Tmp3 = matmul(Rxyz(1:3,1:3), m%DiskAvgVel) + ! Wind in local frame, inertial frame. DiskAvgVel is inertial, so this is a + ! projection onto the disk axes: Rxyz holds them as columns, so v is the left + ! operand. With z_hat perpendicular to VRel by construction, ADVWindz is zero. + Tmp3 = matmul(m%DiskAvgVel, Rxyz(1:3,1:3)) m%AllOuts( ADVWindx ) = Tmp3(1) m%AllOuts( ADVWindy ) = Tmp3(2) m%AllOuts( ADVWindz ) = Tmp3(3) @@ -913,8 +915,8 @@ subroutine Calc_WriteOutput( u, p, y, m, ErrStat, ErrMsg, CalcWriteOutput ) m%AllOuts( ADVWindyi ) = m%DiskAvgVel(2) m%AllOuts( ADVWindzi ) = m%DiskAvgVel(3) - ! Rotor velocity in local frame, inertial frame - Tmp3 = matmul(Rxyz(1:3,1:3), u%HubMotion%TranslationVel(1:3,1)) + ! Rotor velocity in local frame, inertial frame. Projection, as for the wind. + Tmp3 = matmul(u%HubMotion%TranslationVel(1:3,1), Rxyz(1:3,1:3)) m%AllOuts( ADSTVx ) = Tmp3(1) m%AllOuts( ADSTVy ) = Tmp3(2) m%AllOuts( ADSTVz ) = Tmp3(3) @@ -941,13 +943,14 @@ subroutine Calc_WriteOutput( u, p, y, m, ErrStat, ErrMsg, CalcWriteOutput ) m%AllOuts( ADMx ) = real(m%Moment(1),ReKi) m%AllOuts( ADMy ) = real(m%Moment(2),ReKi) m%AllOuts( ADMz ) = real(m%Moment(3),ReKi) - !Tmp3 = m%Force( 1)*m%x_hat + m%Force( 2)*m%y_hat + m%Force( 3)*m%z_hat - Tmp3 = matmul(real(m%Force(1:3),ReKi), Rxyz(1:3,1:3)) + ! Force is held in disk components, so this rebuilds the inertial vector + ! m%Force(1)*x_hat + m%Force(2)*y_hat + m%Force(3)*z_hat; Rxyz is the left operand. + Tmp3 = matmul(Rxyz(1:3,1:3), real(m%Force(1:3),ReKi)) m%AllOuts( ADFxi ) = Tmp3(1) m%AllOuts( ADFyi ) = Tmp3(2) m%AllOuts( ADFzi ) = Tmp3(3) - !Tmp3 = m%Moment(1)*m%x_hat + m%Moment(2)*m%y_hat + m%Moment(3)*m%z_hat - Tmp3 = matmul(real(m%Force(1:3),ReKi), Rxyz(1:3,1:3)) + ! Likewise for the moment, from the moment components. + Tmp3 = matmul(Rxyz(1:3,1:3), real(m%Moment(1:3),ReKi)) m%AllOuts( ADMxi ) = Tmp3(1) m%AllOuts( ADMyi ) = Tmp3(2) m%AllOuts( ADMzi ) = Tmp3(3) From ab5bff3de9069de7d8efbcd89347272b4ba9d335 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Thu, 20 Aug 2026 17:50:44 -0600 Subject: [PATCH 42/66] Give the two wake models one rotor-speed convention RtSpeed, RtTSR, RtAeroPwr and BAeroPwr are written by code shared between the wake models, from a local omega that the two paths set differently. BEMT supplies m%BEMT_u%omega, which already carries RotDir because BEMT is presented a clockwise-equivalent problem. OLAF supplied Calc_Omega, which is the bare physical speed. The power channels multiply by RotDir again. For BEMT the two factors cancel and the reported power is physical, which is correct. For OLAF the single factor would not cancel, so a mirrored rotor would report negative power and a negative power coefficient, and RtSpeed and RtTSR, which do not multiply by RotDir at all, would come out with the opposite sign to the same rotor run under BEMT. OLAF now presents omega in the same clockwise-equivalent convention. RotDir is unity for every rotor that can currently reach this path, since mirrored rotors are refused with OLAF, so no existing result changes; the fix simply removes a trap from the path that work will take. Co-authored-by: Claude Opus 5 Co-authored-by: Claude Sonnet 4.5 --- modules/aerodyn/src/AeroDyn_IO.f90 | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/modules/aerodyn/src/AeroDyn_IO.f90 b/modules/aerodyn/src/AeroDyn_IO.f90 index d974f4fb10..c7de4bc731 100644 --- a/modules/aerodyn/src/AeroDyn_IO.f90 +++ b/modules/aerodyn/src/AeroDyn_IO.f90 @@ -137,7 +137,10 @@ SUBROUTINE Calc_WriteOutput( p, p_AD, u, RotInflow, x, m, m_AD, y, OtherState, x omega = m%BEMT_u(indx)%omega else rmax = Calc_MaxRadius(p, u) - omega = Calc_Omega(u) + ! MirrorRotor: present omega in the same clockwise-equivalent convention that + ! BEMT supplies above, since RtSpeed, RtTSR and the power channels below are + ! shared between the two wake models and cannot carry two conventions at once. + omega = p%RotDir * Calc_Omega(u) endif From e664f8b97ccf7e8ffec884f6ed8d21a0e5b4a957 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Thu, 20 Aug 2026 17:50:44 -0600 Subject: [PATCH 43/66] Register the yawed AeroDisk mirrored-rotor pair Both halves carry the mirrorrotor label, so ctest -R mirrorrotor runs them with the rest. The r-test pointer also brings in the extended AeroDyn output lists, their regenerated baselines, and the AeroDisk baselines that moved with the corrected output transforms. Co-authored-by: Claude Opus 5 Co-authored-by: Claude Sonnet 4.5 --- reg_tests/CTestList.cmake | 2 ++ reg_tests/r-test | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/reg_tests/CTestList.cmake b/reg_tests/CTestList.cmake index 4b9b6ff3ac..975a7a4e6b 100644 --- a/reg_tests/CTestList.cmake +++ b/reg_tests/CTestList.cmake @@ -391,6 +391,8 @@ 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_ADsk_SED_MirrorRotor" "openfast;simple-elastodyn;aerodisk;mirrorrotor") +of_regression("5MW_Land_ADsk_SED_Yaw_CW" "openfast;simple-elastodyn;aerodisk;mirrorrotor") +of_regression("5MW_Land_ADsk_SED_Yaw_MirrorRotor" "openfast;simple-elastodyn;aerodisk;mirrorrotor") 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") diff --git a/reg_tests/r-test b/reg_tests/r-test index 193f91c5ab..c82eb8dddc 160000 --- a/reg_tests/r-test +++ b/reg_tests/r-test @@ -1 +1 @@ -Subproject commit 193f91c5ab0caa58b8ce1daad24aa0e07d488e00 +Subproject commit c82eb8dddcb8ffa88dbb4bbbf8184c9a54d0dfa9 From 0de171bb68509fff9cf78380d6cb0743df9b1f3a Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Thu, 20 Aug 2026 17:51:01 -0600 Subject: [PATCH 44/66] Version the mirror verification tooling The scripts that establish what the regression suite asserts have lived in a scratch directory outside version control, which meant the evidence for the sign table could not be re-created from the repository alone. They now sit in reg_tests/otherTests, alongside a README describing what each one does and the two traps that have cost time before: that the shared classifier reads text output rather than packed binary, and that a .outb written in the packed format resolves to about 1.5e-5, so no comparison drawn from one should be run tighter than that. Each script locates the repository from its own position on disk, honouring OPENFAST_REPO, rather than the absolute path of one developer's checkout. Nothing here is wired into ctest. These are run by hand when a claim needs re-establishing or when a change touches the rotor convention. run_guards.sh is new. It runs the MirrorRotor restrictions in both states and checks that each fatal error appears for a mirrored rotor and does not appear for a clockwise one. The linearisation, OLAF and AeroAcoustics guards all behave correctly. The steady-state solver guard cannot be reached this way, because the flag it tests is a parameter fixed to false on the path the openfast binary takes, and only the aero-map program passes it as true. Co-authored-by: Claude Opus 5 Co-authored-by: Claude Sonnet 4.5 --- reg_tests/otherTests/README.md | 54 +++ reg_tests/otherTests/bts_io.py | 263 +++++++++++++++ reg_tests/otherTests/check_bd_vs_ed.py | 83 +++++ reg_tests/otherTests/check_ed_outparams.py | 126 +++++++ reg_tests/otherTests/check_mirror_bts.py | 53 +++ reg_tests/otherTests/check_outlist_dupes.py | 35 ++ .../otherTests/check_rtest_mirror_pair.py | 115 +++++++ reg_tests/otherTests/compare_mirror.py | 175 ++++++++++ reg_tests/otherTests/dump_outlist_xlsx.py | 92 ++++++ reg_tests/otherTests/emit_sign_table.py | 196 +++++++++++ reg_tests/otherTests/fix_dvr_comment.py | 52 +++ .../otherTests/make_adsk_lateral_table.py | 33 ++ reg_tests/otherTests/make_rtest_cases.py | 193 +++++++++++ reg_tests/otherTests/mirror_bts.py | 35 ++ reg_tests/otherTests/mr_two_rotor.py | 120 +++++++ reg_tests/otherTests/openfast_case_mirror.py | 257 +++++++++++++++ reg_tests/otherTests/openfast_mirror.py | 307 ++++++++++++++++++ .../otherTests/openfast_mirror_matrix.py | 54 +++ reg_tests/otherTests/openfast_regression.py | 97 ++++++ reg_tests/otherTests/rtest_regression.py | 106 ++++++ reg_tests/otherTests/run_guards.sh | 60 ++++ reg_tests/otherTests/sed_canary.py | 118 +++++++ reg_tests/otherTests/sweep_mirror.py | 174 ++++++++++ reg_tests/otherTests/v2_two_rotor.py | 91 ++++++ 24 files changed, 2889 insertions(+) create mode 100644 reg_tests/otherTests/README.md create mode 100644 reg_tests/otherTests/bts_io.py create mode 100644 reg_tests/otherTests/check_bd_vs_ed.py create mode 100644 reg_tests/otherTests/check_ed_outparams.py create mode 100644 reg_tests/otherTests/check_mirror_bts.py create mode 100644 reg_tests/otherTests/check_outlist_dupes.py create mode 100644 reg_tests/otherTests/check_rtest_mirror_pair.py create mode 100644 reg_tests/otherTests/compare_mirror.py create mode 100644 reg_tests/otherTests/dump_outlist_xlsx.py create mode 100644 reg_tests/otherTests/emit_sign_table.py create mode 100644 reg_tests/otherTests/fix_dvr_comment.py create mode 100644 reg_tests/otherTests/make_adsk_lateral_table.py create mode 100644 reg_tests/otherTests/make_rtest_cases.py create mode 100644 reg_tests/otherTests/mirror_bts.py create mode 100644 reg_tests/otherTests/mr_two_rotor.py create mode 100644 reg_tests/otherTests/openfast_case_mirror.py create mode 100644 reg_tests/otherTests/openfast_mirror.py create mode 100644 reg_tests/otherTests/openfast_mirror_matrix.py create mode 100644 reg_tests/otherTests/openfast_regression.py create mode 100644 reg_tests/otherTests/rtest_regression.py create mode 100755 reg_tests/otherTests/run_guards.sh create mode 100644 reg_tests/otherTests/sed_canary.py create mode 100644 reg_tests/otherTests/sweep_mirror.py create mode 100644 reg_tests/otherTests/v2_two_rotor.py diff --git a/reg_tests/otherTests/README.md b/reg_tests/otherTests/README.md new file mode 100644 index 0000000000..6b1bd86371 --- /dev/null +++ b/reg_tests/otherTests/README.md @@ -0,0 +1,54 @@ +# otherTests + +Verification tooling that is not part of the ctest regression suite but is +needed to justify what the regression suite asserts. These scripts measure +behaviour that a stored baseline cannot express on its own — most of them exist +to support the counter-clockwise rotor work described in +`docs/source/user/glue-code/mirror_rotor.rst`. + +Nothing here runs automatically. The scripts are run by hand when a claim needs +re-establishing, or when a change touches the rotor convention. + +Each script locates the repository from its own position on disk, so they work +from any checkout. Set `OPENFAST_REPO` to override that. + +## The mirror comparison + +A mirrored rotor is verified by running a model twice, once clockwise and once +with `MirrorRotor = T`, and requiring **every** output channel to resolve to one +of: identical, exactly sign-flipped, a mirrored angle, or below the numerical +noise floor. Anything else means two quantities have been combined while +expressed in different frames. + +| Script | What it does | +|---|---| +| `compare_mirror.py` | the shared classifier. `classify(x, y, tol, floor)` returns `S`, `F`, `A`, `negligible` or `?`. Also holds `blade_permutation`, since blade 1 lies on the mirror plane and blades 2 and 3 exchange. Everything else imports this | +| `emit_sign_table.py` | regenerates the measured sign table in `mirror_rotor.rst` by running every registered mirrored pair and classifying every channel | +| `check_rtest_mirror_pair.py` | checks the registered clockwise/mirrored pairs, with per-pair blade count, tolerance and start time | +| `openfast_case_mirror.py` | clones a regression case verbatim and toggles only `MirrorRotor` | +| `mr_two_rotor.py` | compares rotor 1 against rotor 2 inside one multi-rotor glue-code run | +| `v2_two_rotor.py` | the same for the AeroDyn driver, handling the `A?BN...` nodal naming | +| `sweep_mirror.py`, `openfast_mirror.py`, `openfast_mirror_matrix.py` | sweep the comparison over pitch, wind speed, tip-speed ratio, tilt, precone and the wake and unsteady-aerodynamics models | +| `sed_canary.py` | the SimplifiedElastoDyn brake check | +| `run_guards.sh` | proves the `MirrorRotor` guard rails fire, and fire only for a mirrored rotor | +| `make_adsk_lateral_table.py` | derives an AeroDisk coefficient table carrying lateral coefficients, since the shipped 5MW table has them identically zero | +| `bts_io.py`, `mirror_bts.py`, `check_mirror_bts.py` | reflect a TurbSim box in `y` and verify the result. `bts_io.py` also documents the `.bts` format | + +## Reading output files + +`compare_mirror.main()` reads **text** `.out` files. For `.outb`, import +`classify` and use `reg_tests/lib/pass_fail.readFASTOut` directly, as the other +scripts do. + +`.outb` written with `OutFileFmt = 2` packs each channel into int16, giving +about `1/65536`, or `1.5e-5`, relative resolution. **Do not claim agreement +tighter than that from such a file.** For precision work set `OutFileFmt = 4`. +Text output is worse, not better, at the default `OutFmt`. + +## Other checks + +| Script | What it does | +|---|---| +| `check_ed_outparams.py`, `check_bd_vs_ed.py` | cross-check output parameter tables against the source | +| `check_outlist_dupes.py`, `dump_outlist_xlsx.py` | check `OutListParameters.xlsx` against the registered channels | +| `make_rtest_cases.py`, `rtest_regression.py`, `openfast_regression.py`, `fix_dvr_comment.py` | case generation and bulk regression helpers | diff --git a/reg_tests/otherTests/bts_io.py b/reg_tests/otherTests/bts_io.py new file mode 100644 index 0000000000..16cc7a9bf7 --- /dev/null +++ b/reg_tests/otherTests/bts_io.py @@ -0,0 +1,263 @@ +""" +Reader/writer for TurbSim binary full-field (.bts) files, matching the format +implemented in OpenFAST: + - Writer: modules/turbsim/src/TS_FileIO.f90 (SUBROUTINE WrBinTURBSIM) + - Reader: modules/inflowwind/src/InflowWind_IO.f90 (SUBROUTINE IfW_TurbSim_Init) + +Header layout (stream/unformatted, little-endian, 70 bytes total): + int16 FileID (7 = non-periodic, 8 = periodic) + int32 NZGrids + int32 NYGrids + int32 NTGrids (number of tower points, may be 0) + int32 NSteps + float32 dz + float32 dy + float32 dt + float32 MeanWS (mws, hub-height mean wind speed) + float32 RefHeight (hub height) + float32 GridBase (height of bottom of grid) + float32 VslopeX, VoffsetX (U-component scale/offset) + float32 VslopeY, VoffsetY (V-component scale/offset) + float32 VslopeZ, VoffsetZ (W-component scale/offset) + int32 DescLen (number of ASCII bytes in description string) + +Followed by: + DescLen bytes -> ASCII description string (no null terminator) + +Then, for each of NSteps time steps: + int16 grid data, shape (NZGrids, NYGrids, 3) in C order + -> for iz in 0..NZGrids-1: for iy in 0..NYGrids-1: for ic in (U,V,W) + -> IY varies fastest, then IZ; component (U,V,W) is fastest of all + if NTGrids > 0: + int16 tower data, shape (NTGrids, 3) in C order + +Grid Y-index convention (confirmed from InflowWind_IO.f90, IfW_FlowField.f90): + Y_grid_index (1-based) = (Y_position + YHWid) / dy + 1 + => iy = 0 (0-based) corresponds to Y = -YHWid (most negative Y) + => iy = NYGrids-1 corresponds to Y = +YHWid (most positive Y) + i.e. increasing iy <=> increasing Y coordinate. + +Wind components are ordered (U, V, W) = (longitudinal-X, lateral-Y, vertical-Z). +Tower points all lie on the Y=0 centerline (X,Y=0 column, various Z below grid base). +""" + +import struct +from dataclasses import dataclass +from typing import Optional + +import numpy as np + +HEADER_STRUCT = struct.Struct(" np.ndarray: + """Return de-normalized (physical, m/s) grid velocities, shape (NSteps, NZGrids, NYGrids, 3), float32.""" + out = np.empty(self.grid.shape, dtype=np.float32) + for ic in range(3): + out[..., ic] = (self.grid[..., ic].astype(np.float32) - self.Voffset[ic]) / self.Vslope[ic] + return out + + def decode_tower(self) -> Optional[np.ndarray]: + if self.tower is None: + return None + out = np.empty(self.tower.shape, dtype=np.float32) + for ic in range(3): + out[..., ic] = (self.tower[..., ic].astype(np.float32) - self.Voffset[ic]) / self.Vslope[ic] + return out + + +def read_bts(path: str) -> BTSFile: + with open(path, "rb") as f: + raw_header = f.read(HEADER_SIZE) + if len(raw_header) != HEADER_SIZE: + raise IOError(f"Could not read {HEADER_SIZE}-byte header from {path}") + vals = HEADER_STRUCT.unpack(raw_header) + h = dict(zip(_HEADER_FIELDS, vals)) + + desc_bytes = f.read(h["DescLen"]) + if len(desc_bytes) != h["DescLen"]: + raise IOError(f"Could not read {h['DescLen']}-byte description string from {path}") + desc_str = desc_bytes.decode("ascii", errors="replace") + + n_grid_vals_per_step = 3 * h["NYGrids"] * h["NZGrids"] + n_twr_vals_per_step = 3 * h["NTGrids"] + + grid = np.empty((h["NSteps"], h["NZGrids"], h["NYGrids"], 3), dtype=np.int16) + tower = None + if h["NTGrids"] > 0: + tower = np.empty((h["NSteps"], h["NTGrids"], 3), dtype=np.int16) + + for it in range(h["NSteps"]): + buf = f.read(2 * n_grid_vals_per_step) + if len(buf) != 2 * n_grid_vals_per_step: + raise IOError(f"Truncated grid data at time step {it} in {path}") + grid[it] = np.frombuffer(buf, dtype=" 0: + buf = f.read(2 * n_twr_vals_per_step) + if len(buf) != 2 * n_twr_vals_per_step: + raise IOError(f"Truncated tower data at time step {it} in {path}") + tower[it] = np.frombuffer(buf, dtype=" None: + desc_bytes = bts.DescStr.encode("ascii") + desc_len = len(desc_bytes) + + header_vals = [ + bts.FileID, + bts.NZGrids, bts.NYGrids, bts.NTGrids, bts.NSteps, + bts.dz, bts.dy, bts.dt, + bts.MeanWS, bts.RefHeight, bts.GridBase, + bts.VslopeX, bts.VoffsetX, + bts.VslopeY, bts.VoffsetY, + bts.VslopeZ, bts.VoffsetZ, + desc_len, + ] + + with open(path, "wb") as f: + f.write(HEADER_STRUCT.pack(*header_vals)) + f.write(desc_bytes) + + for it in range(bts.NSteps): + f.write(np.ascontiguousarray(bts.grid[it], dtype=" 0: + f.write(np.ascontiguousarray(bts.tower[it], dtype=" np.ndarray: + """Encode physical (m/s) values back to clamped, rounded int16 raw values.""" + raw = np.round(v_phys * slope + offset) + raw = np.clip(raw, -32768, 32767) + return raw.astype(np.int16) + + +def mirror_xz(bts: BTSFile, note: Optional[str] = None) -> BTSFile: + """Return a new BTSFile mirrored across the XZ plane (Y -> -Y). + + - Reverses the Y-index ordering of the grid data (grid point at +Y swaps + with the corresponding point at -Y). + - Flips the sign of the V (lateral, Y) velocity component for both the + grid and tower data (physical velocity, decoded/re-encoded using the + file's own slope/offset so the int16 raw values remain internally + consistent). + - Tower points lie on the Y=0 centerline, so only the V-component sign + flip applies there (no reordering needed). + + Note on V scaling: the original file's VslopeY/VoffsetY were calibrated + (by TurbSim) to the min/max of the *original* (generally asymmetric) V + data. After negating V, those extremes land on the opposite side of the + range and would clip against the original int16 scaling. So VslopeY and + VoffsetY are recomputed here from the mirrored V data's own min/max, + following TurbSim's own scaling formula (WrBinTURBSIM in TS_FileIO.f90). + U and W values are unchanged by mirroring (only their Y location moves), + so their slope/offset are left untouched. + """ + IntMin, IntMax = -32768.0, 32767.0 + IntRng = IntMax - IntMin + + grid_phys = bts.decode_grid() + grid_phys = grid_phys[:, :, ::-1, :] # reverse Y index + grid_phys[..., 1] = -grid_phys[..., 1] # flip V component + + twr_phys = None + if bts.tower is not None: + twr_phys = bts.decode_tower() + twr_phys[..., 1] = -twr_phys[..., 1] + + # Recompute V-component slope/offset from the mirrored data's min/max + # (grid + tower combined), matching TurbSim's own scaling algorithm. + v_vals = [grid_phys[..., 1]] + if twr_phys is not None: + v_vals.append(twr_phys[..., 1]) + v_min = min(float(v.min()) for v in v_vals) + v_max = max(float(v.max()) for v in v_vals) + if v_max == v_min: + new_VslopeY = 1.0 + else: + new_VslopeY = IntRng / (v_max - v_min) + new_VoffsetY = IntMin - new_VslopeY * v_min + + new_slope = (bts.VslopeX, new_VslopeY, bts.VslopeZ) + new_offset = (bts.VoffsetX, new_VoffsetY, bts.VoffsetZ) + + new_grid = np.empty_like(bts.grid) + for ic in range(3): + new_grid[..., ic] = _renormalize(grid_phys[..., ic], new_slope[ic], new_offset[ic]) + + new_tower = None + if twr_phys is not None: + new_tower = np.empty_like(bts.tower) + for ic in range(3): + new_tower[..., ic] = _renormalize(twr_phys[..., ic], new_slope[ic], new_offset[ic]) + + new_desc = bts.DescStr + if note: + new_desc = (new_desc + " " + note) if new_desc else note + + return BTSFile( + FileID=bts.FileID, + NZGrids=bts.NZGrids, NYGrids=bts.NYGrids, NTGrids=bts.NTGrids, NSteps=bts.NSteps, + dz=bts.dz, dy=bts.dy, dt=bts.dt, + MeanWS=bts.MeanWS, RefHeight=bts.RefHeight, GridBase=bts.GridBase, + VslopeX=bts.VslopeX, VoffsetX=bts.VoffsetX, + VslopeY=new_VslopeY, VoffsetY=new_VoffsetY, + VslopeZ=bts.VslopeZ, VoffsetZ=bts.VoffsetZ, + DescStr=new_desc, + grid=new_grid, + tower=new_tower, + ) diff --git a/reg_tests/otherTests/check_bd_vs_ed.py b/reg_tests/otherTests/check_bd_vs_ed.py new file mode 100644 index 0000000000..673d389794 --- /dev/null +++ b/reg_tests/otherTests/check_bd_vs_ed.py @@ -0,0 +1,83 @@ +#!/usr/bin/env python3 +"""Phase 2 acceptance: BeamDyn and ElastoDyn must disagree no more when mirrored. + +BeamDyn and ElastoDyn are different blade models, so their results differ even for +a clockwise rotor. What matters is that mirroring does not make them disagree any +more than they already do: if the mirrored discrepancy matches the clockwise one, +the mirror is not introducing error of its own. + +Usage: check_bd_vs_ed.py +""" +import os +import sys + +import numpy as np + +REPO_ROOT = os.environ.get("OPENFAST_REPO") or os.path.dirname( + os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) +REPO = REPO_ROOT +RTEST = f"{REPO}/reg_tests/r-test/glue-codes/openfast" +sys.path.insert(0, f"{REPO}/reg_tests/lib") +import fast_io # noqa: E402 + +DIAG = {"Time", "ConvError", "ConvIter", "NumUJac"} + + +def read(case): + data, info, _ = fast_io.load_output(os.path.join(RTEST, case, f"{case}.outb")) + return info["attribute_names"], np.asarray(data) + + +def discrepancy(ed_case, bd_case): + """Per-channel relative difference between the two blade models.""" + n1, a = read(ed_case) + n2, b = read(bd_case) + i1 = {k: v for v, k in enumerate(n1)} + i2 = {k: v for v, k in enumerate(n2)} + shared = [c for c in n1 if c in i2 and c not in DIAG] + + # BeamDyn runs at a finer time step, so put it on the ElastoDyn time base. + t1, t2 = a[:, i1["Time"]], b[:, i2["Time"]] + keep = t1 >= 0.5 * t1[-1] + scale = np.abs(a[keep][:, 1:]).max() + + out = {} + for c in shared: + x = a[keep, i1[c]] + y = np.interp(t1[keep], t2, b[:, i2[c]]) + den = max(np.abs(x).max(), 1e-12) + if den < 1e-9 * scale: + continue + out[c] = np.abs(y - x).max() / den + return out + + +def main(): + cw = discrepancy("5MW_Land_noDLL_Steady_CW", "5MW_Land_BD_noDLL_Steady_CW") + mir = discrepancy("5MW_Land_noDLL_Steady_MirrorRotor", + "5MW_Land_BD_noDLL_Steady_MirrorRotor") + + shared = sorted(set(cw) & set(mir)) + print(f"{'channel':14s} {'CW BD-vs-ED':>13s} {'MIR BD-vs-ED':>13s} {'ratio':>8s}") + worst = 0.0 + worst_ch = "" + for c in shared: + # A mirrored channel that flips sign is compared on magnitude, so take the + # smaller of the two orientations. + r = mir[c] / max(cw[c], 1e-12) + if cw[c] > 1e-6 and r > worst: + worst, worst_ch = r, c + print(f"{c:14s} {cw[c]:13.4e} {mir[c]:13.4e} {r:8.3f}") + + print(f"\nchannels compared: {len(shared)}") + print(f"worst ratio: {worst:.3f} on {worst_ch}") + # The mirrored discrepancy should track the clockwise one. Allow a factor of two + # for the two runs drifting differently within an already-different model. + if worst > 2.0: + print("FAIL: mirroring widens the BeamDyn/ElastoDyn gap") + sys.exit(1) + print("PASS: mirroring does not widen the BeamDyn/ElastoDyn gap") + + +if __name__ == "__main__": + main() diff --git a/reg_tests/otherTests/check_ed_outparams.py b/reg_tests/otherTests/check_ed_outparams.py new file mode 100644 index 0000000000..b20ed1189d --- /dev/null +++ b/reg_tests/otherTests/check_ed_outparams.py @@ -0,0 +1,126 @@ +#!/usr/bin/env python3 +"""Check the ElastoDyn output-parameter tables stay consistent. + +ValidParamAry, ParamIndxAry and ParamUnitsAry are three parallel Fortran array +literals indexed by position. Nothing in the build checks they line up, so a +misalignment silently reports the wrong channel. This parses all three straight +out of the source and verifies: + + - all three have the declared length, and the same length as each other + - ValidParamAry is sorted alphabetically (SetOutParam binary-searches it) + - no duplicate channel names + - every ParamIndxAry symbol is a declared AllOuts index within MaxOutPts + +With channel names as arguments it also prints what each currently maps to, +which is the safe way to retarget an alias. + +Usage: check_ed_outparams.py [CHANNEL ...] +""" +import os +import re +import sys + +REPO_ROOT = os.environ.get("OPENFAST_REPO") or os.path.dirname( + os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +ED = os.path.join(REPO_ROOT, "modules", "elastodyn", "src", "ElastoDyn.f90") +IO = os.path.join(REPO_ROOT, "modules", "elastodyn", "src", "ElastoDyn_IO.f90") + + +def grab_array(text, name): + """Return (declared_length, [entries]) for a Fortran array literal.""" + m = re.search(rf"{name}\((\d+)\)\s*=\s*\(/", text) + if not m: + sys.exit(f"could not find {name}") + declared = int(m.group(1)) + start = m.end() + end = text.index("/)", start) + body = text[start:end] + # Strip Fortran trailing comments and continuations before splitting, or the + # comment on the declaration line gets parsed as the first entry. + body = "\n".join(l.split("!")[0] for l in body.split("\n")) + body = re.sub(r"character\(ChanLen\)\s*::", "", body) + body = body.replace("&", " ") + items = [t.strip() for t in body.split(",")] + items = [t for t in items if t] + items = [t[1:-1].strip() if t.startswith('"') else t for t in items] + return declared, items + + +def main(): + ed = open(ED).read() + io = open(IO).read() + + indices = dict(re.findall( + r"INTEGER\(IntKi\),\s*PARAMETER\s*::\s*(\w+)\s*=\s*(\d+)", io)) + indices = {k: int(v) for k, v in indices.items()} + maxout = indices.get("MaxOutPts") + + n_names, names = grab_array(ed, "ValidParamAry") + n_indx, indx = grab_array(ed, "ParamIndxAry") + n_unit, units = grab_array(ed, "ParamUnitsAry") + + bad = 0 + print(f"MaxOutPts = {maxout}") + for label, declared, got in (("ValidParamAry", n_names, len(names)), + ("ParamIndxAry", n_indx, len(indx)), + ("ParamUnitsAry", n_unit, len(units))): + ok = declared == got + bad += not ok + print(f"{label:15s} declared {declared:5d} parsed {got:5d} " + f"{'ok' if ok else 'MISMATCH'}") + + if not (len(names) == len(indx) == len(units)): + print("ARRAYS ARE NOT THE SAME LENGTH - they are indexed in parallel") + bad += 1 + + unsorted = [(a, b) for a, b in zip(names, names[1:]) if a.strip() > b.strip()] + if unsorted: + bad += 1 + print(f"NOT ALPHABETICAL ({len(unsorted)}): first at {unsorted[0]}") + else: + print("ValidParamAry alphabetical ok") + + seen, dupes = set(), [] + for nm in names: + s = nm.strip() + if s in seen: + dupes.append(s) + seen.add(s) + if dupes: + bad += 1 + print(f"DUPLICATE NAMES: {dupes}") + else: + print("ValidParamAry no duplicates ok") + + unknown = sorted({s for s in indx if s not in indices}) + if unknown: + bad += 1 + print(f"UNKNOWN INDEX SYMBOLS: {unknown[:10]}") + else: + over = sorted({s for s in indx if indices[s] > maxout}) + if over: + bad += 1 + print(f"INDEX SYMBOLS BEYOND MaxOutPts: {over}") + else: + print("ParamIndxAry all symbols known and within MaxOutPts ok") + + wanted = [a.upper() for a in sys.argv[1:]] + if wanted: + print("\nrequested channels:") + lookup = {nm.strip(): i for i, nm in enumerate(names)} + for w in wanted: + if w not in lookup: + print(f" {w:12s} NOT FOUND") + continue + i = lookup[w] + sym = indx[i] + print(f" {w:12s} pos {i:5d} -> {sym:12s} " + f"(AllOuts {indices.get(sym, '?')}) units {units[i].strip()}") + + print("\nOK" if not bad else f"\n{bad} problem(s)") + sys.exit(1 if bad else 0) + + +if __name__ == "__main__": + main() diff --git a/reg_tests/otherTests/check_mirror_bts.py b/reg_tests/otherTests/check_mirror_bts.py new file mode 100644 index 0000000000..c58c16e646 --- /dev/null +++ b/reg_tests/otherTests/check_mirror_bts.py @@ -0,0 +1,53 @@ +"""Check that the mirrored .bts really is the y-reflection of the original. + +Reads both boxes back through the same reader and requires u and w to be the +reverse of each other along y, and v to be the reverse and sign-flipped. Reading +the written file back matters: the format stores int16 with a per-component +scale and offset, so the round trip is where a mistake would show up. +""" +import os +import sys + +import numpy as np + +import bts_io + +REPO_ROOT = os.environ.get("OPENFAST_REPO") or os.path.dirname( + os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +BASE = os.path.join(REPO_ROOT, "reg_tests", "r-test", "glue-codes", + "openfast", "5MW_Baseline", "Wind") +orig = bts_io.read_bts(f"{BASE}/90m_12mps_twr.bts") +mir = bts_io.read_bts(f"{BASE}/90m_12mps_twr_MirrorY.bts") + +for name in ("FileID", "NYGrids", "NZGrids", "NTGrids", "NSteps", + "dy", "dz", "dt", "MeanWS", "RefHeight", "GridBase"): + a, b = getattr(orig, name), getattr(mir, name) + if a != b: + sys.exit(f"{name} differs: {a} vs {b}") + +o = orig.decode_grid() # (NSteps, NZGrids, NYGrids, 3) +m = mir.decode_grid() +print(f"grid {o.shape} (time, z, y, component)") + +sign = (1.0, -1.0, 1.0) +worst = 0.0 +for c, s in enumerate(sign): + expect = s * o[:, :, ::-1, c] + err = np.abs(m[:, :, :, c] - expect).max() / max(np.abs(o[..., c]).max(), 1e-12) + worst = max(worst, err) + print(f" component {'uvw'[c]}: max rel error {err:.3e}") + +# The tower line sits at y = 0, so it maps onto itself and only v changes sign. +ot, mt = orig.decode_tower(), mir.decode_tower() +if ot is not None: + for c, s in enumerate(sign): + err = np.abs(mt[..., c] - s * ot[..., c]).max() / max(np.abs(ot[..., c]).max(), 1e-12) + worst = max(worst, err) + print(f" tower {'uvw'[c]}: max rel error {err:.3e}") + +# One int16 quantum is 1/32768 of the stored range, and the two files are quantised +# independently, so a couple of quanta is the floor. +ok = worst < 1e-3 +print("PASS" if ok else "FAIL", f"worst={worst:.3e}") +sys.exit(0 if ok else 1) diff --git a/reg_tests/otherTests/check_outlist_dupes.py b/reg_tests/otherTests/check_outlist_dupes.py new file mode 100644 index 0000000000..c882ca5044 --- /dev/null +++ b/reg_tests/otherTests/check_outlist_dupes.py @@ -0,0 +1,35 @@ +"""Check no output channel name appears twice in a tab. + +A name listed both as a primary and as somebody else's alias is exactly the +condition the alias split exists to remove: the workbook would claim two +channels are the same while the code gives them opposite signs. +""" +import collections +import subprocess +import sys + +TABS = ["ElastoDyn", "SimpleElastoDyn"] + +for tab in TABS: + out = subprocess.run([sys.executable, "dump_outlist_xlsx.py", tab], + capture_output=True, text=True).stdout + seen = collections.defaultdict(list) + for line in out.split("\n"): + if not line.strip(): + continue + row, _, rest = line.strip().partition(" ") + for field in rest.split("|"): + field = field.strip() + if field.startswith("B:"): + seen[field[2:].strip()].append(row) + elif field.startswith("C:"): + for name in field[2:].split(","): + if name.strip(): + seen[name.strip()].append(row) + + dupes = {k: v for k, v in seen.items() if len(v) > 1 and k not in ("Name", "Other Name(s)")} + print(f"{tab}: {len(seen)} names") + for name, rows in sorted(dupes.items()): + print(f" DUPLICATE {name!r} in rows {', '.join(rows)}") + if not dupes: + print(" no duplicates") diff --git a/reg_tests/otherTests/check_rtest_mirror_pair.py b/reg_tests/otherTests/check_rtest_mirror_pair.py new file mode 100644 index 0000000000..316866a36d --- /dev/null +++ b/reg_tests/otherTests/check_rtest_mirror_pair.py @@ -0,0 +1,115 @@ +#!/usr/bin/env python3 +"""Verify the committed r-test mirror pair actually mirrors. + +Compares the two stored baselines against each other, so the property the pair +exists to demonstrate is checked at the same time the baselines are produced. + +Usage: check_rtest_mirror_pair.py +""" +import os +import sys + +import numpy as np + +REPO_ROOT = os.environ.get("OPENFAST_REPO") or os.path.dirname( + os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) +REPO = REPO_ROOT +RTEST = f"{REPO}/reg_tests/r-test/glue-codes/openfast" +# The r-test baselines are .outb, which packs each channel into int16 with a per-channel +# scale and offset. That quantises to about 1.5e-5 of the channel range, so comparing the +# pair any tighter than this measures the file format rather than the physics. +TOL = 1e-4 + +# (clockwise case, mirrored case, blades, tolerance, start of comparison window) +# The AWT case brings the shaft to a halt under the HSS brake. The stop is a genuine +# discontinuity -- the brake torque switches sign as the shaft sticks -- and it amplifies +# round-off, so that pair needs a looser tolerance than the steady cases. Its window opens +# earlier as well, to cover the period when the generator is still connected. +PAIRS = [("5MW_Land_noDLL_Steady_CW", "5MW_Land_noDLL_Steady_MirrorRotor", 3, TOL, 0.5), + ("5MW_Land_BD_noDLL_Steady_CW", "5MW_Land_BD_noDLL_Steady_MirrorRotor", 3, TOL, 0.5), + ("AWT_WSt_StartUp_HighSpShutDown", + "AWT_WSt_StartUp_HighSpShutDown_MirrorRotor", 2, 5e-4, 0.25), + # Turbulent inflow with ROSCO in the loop, against a y-reflected turbulence box. + # The ElastoDyn pair holds the same tolerance as the steady cases. The BeamDyn + # one needs a little more, and only for the root torsional moment, which is small + # and stiff enough that its own peak is a harsh denominator. + ("5MW_Land_DLL_WTurb", "5MW_Land_DLL_WTurb_MirrorRotor", 3, TOL, 0.25), + ("5MW_Land_BD_DLL_WTurb", "5MW_Land_BD_DLL_WTurb_MirrorRotor", 3, 1e-3, 0.25)] + +# Channels that pair up by layout rather than by blade order. The OC4 semi's mooring +# line 2 lies on the mirror plane, so lines 1 and 3 swap -- the opposite arrangement to +# the blades, where blade 1 is the one on the plane. +SWAP = {"5MW_OC4Semi_WSt_WavesWN_MirrorRotor": + {"FAIRTEN1": "FAIRTEN3", "FAIRTEN3": "FAIRTEN1", + "ANCHTEN1": "ANCHTEN3", "ANCHTEN3": "ANCHTEN1"}} + +# Unlike the other pairs, the clockwise half here is an upstream baseline produced by a +# different build, so this comparison carries a build difference on top of the mirror. +# Measured: re-running the clockwise case with the current build differs from its stored +# baseline by a median of 1.3e-4 and a maximum of 2.6e-3, and those figures reappear +# channel-for-channel in the pair residual to four significant figures. Compared within a +# single build the pair resolves completely, so the tolerance is set by provenance, not by +# the mirror. Discrimination is still a factor of ~1000. +PAIRS.append(("5MW_OC4Semi_WSt_WavesWN", "5MW_OC4Semi_WSt_WavesWN_MirrorRotor", 3, 5e-3, 0.25)) + +sys.path.insert(0, f"{REPO}/reg_tests/lib") +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) +import fast_io # noqa: E402 +from compare_mirror import classify, blade_permutation # noqa: E402 + +DIAG = {"Time", "ConvError", "ConvIter", "NumUJac"} + +# The r-test baselines are .outb, which packs each channel into int16 with a per-channel +# scale and offset. That quantises to about 1.5e-5 of the channel range, so comparing the +# pair any tighter than this measures the file format rather than the physics. +TOL = 1e-4 + + +def read(case): + path = os.path.join(RTEST, case, f"{case}.outb") + data, info, _ = fast_io.load_output(path) + return info["attribute_names"], np.asarray(data) + + +def check_pair(cw, mir, nblades, tol, start): + n1, a = read(cw) + n2, b = read(mir) + if n1 != n2: + sys.exit("channel lists differ between the two cases") + idx = {k: v for v, k in enumerate(n1)} + sl = slice(int(start * len(a)), None) + phys = [idx[c] for c in n1 if c not in DIAG] + floor = 1e-9 * np.abs(a[sl][:, phys]).max() + + groups = {} + for ch in n1: + if ch in DIAG: + continue + mate = SWAP.get(mir, {}).get(ch) or blade_permutation(ch, nblades) + if mate not in idx: + mate = ch + got, rel = classify(a[sl, idx[ch]], b[sl, idx[mate]], tol, floor) + groups.setdefault(got, []).append(ch) + + for k in ("S", "F", "A", "negligible", "?"): + if groups.get(k): + print(f"{k:11s} ({len(groups[k]):3d}): {' '.join(groups[k])}") + bad = groups.get("?", []) + print(f" {len(n1) - len(DIAG & set(n1))} channels compared") + if bad: + print(f" FAIL: {len(bad)} channel(s) unresolved: {' '.join(bad)}") + return 1 + print(" PASS: clean mirror pair") + return 0 + + +def main(): + bad = 0 + for cw, mir, nblades, tol, start in PAIRS: + print(f"=== {cw} vs {mir} ===") + bad += check_pair(cw, mir, nblades, tol, start) + sys.exit(1 if bad else 0) + + +if __name__ == "__main__": + main() diff --git a/reg_tests/otherTests/compare_mirror.py b/reg_tests/otherTests/compare_mirror.py new file mode 100644 index 0000000000..698374e523 --- /dev/null +++ b/reg_tests/otherTests/compare_mirror.py @@ -0,0 +1,175 @@ +#!/usr/bin/env python3 +"""Compare a CW baseline run against a mirrored run. + +Every channel must resolve to one of: identical, exactly sign-flipped, a mirrored +angle, or below the file's numerical noise floor. Anything else is reported as +unclassified, which is what a frame-mixing bug looks like. + +Under non-axisymmetric inflow (shear, yaw) the blades no longer line up channel +for channel: mirroring reverses the sweep order, so CW blade 2 must be compared +against mirrored blade 3. Pass --permute to enable that remapping. + +Usage: compare_mirror.py [--tol 1e-6] [--permute] [--all] +""" +import re +import sys + +import numpy as np + +# Expected symmetry class per channel. +# S = identical, F = exactly sign-flipped, A = mirrored angle (mod 360) +EXPECT = { + "RtTSR": "S", "RtArea": "S", "RtSkew": "S", + "RtAeroFxh": "S", "RtAeroFzh": "S", "RtAeroMyh": "S", + "RtAeroPwr": "S", "RtAeroCp": "S", "RtAeroCt": "S", + "RtVAvgxh": "S", "RtVAvgzh": "S", + "RtAeroFyh": "F", "RtAeroMxh": "F", "RtAeroMzh": "F", + "RtAeroCq": "F", "RtVAvgyh": "F", + "Azimuth": "S", "RotSpeed": "S", +} +for _b in range(1, 4): + for _n in range(1, 10): + for _q in ("Alpha", "Phi", "Vrel", "Cl", "Cd", "Cx", "Cn", "Vindx", + "AxInd", "TnInd", "Fn", "Fl", "Fd", "M", "Gam", "Theta", + "Curve", "Vdisx", "Vundx"): + EXPECT[f"B{_b}N{_n}{_q}"] = "S" + for _q in ("Cy", "Ct", "Cm", "Ft", "Mm", "Vindy", "Toe", + "Vdisy", "Vundy"): + EXPECT[f"B{_b}N{_n}{_q}"] = "F" + +# Reported but not asserted. Per-blade azimuth is a wrapped diagnostic angle whose +# mirror reference depends on blade index, rotor tilt and whether the blade +# permutation is in play (under tilt it picks up a clean 180 deg offset). It +# carries no load information, and the rotor-level "Azimuth" channel is asserted. +INFORMATIONAL = [r"^B\d+Azimuth$"] + + +def load(path): + lines = open(path, errors="replace").read().split("\n") + h = next(i for i, l in enumerate(lines) if l.strip().startswith("Time")) + names = lines[h].split() + rows = [[float(x) for x in l.split()] for l in lines[h + 2:] if l.strip()] + return names, np.array(rows) + + +# ElastoDyn names the blade with a trailing index (OoPDefl2) where AeroDyn uses a +# leading one (B2N1Alpha). Listing the prefixes explicitly avoids mangling names +# that merely happen to end in a digit. +ED_BLADE_PREFIX = re.compile( + r"^(OoPDefl|IPDefl|TipALxb|TipALyb|TipALzb|TipDx[bc]|TipDy[bc]|TipDz[bc]|" + r"TipClrnc|TipRDx[bc]|TipRDy[bc]|TipRDz[bc]|RootF[xyz][bc]|RootM[xyz][bc]|" + r"RootMEdg|RootMFlp|RootMIP|RootMOoP|RootFxb|BldPitch|PtchPMzc|" + r"Spn\d+ALxb|Spn\d+ALyb|Spn\d+ALzb|Spn\d+TDxb|Spn\d+TDyb|" + r"Spn\d+TDzb|Spn\d+RDxb|Spn\d+RDyb|Spn\d+RDzb|Spn\d+FLxb|Spn\d+FLyb|" + r"Spn\d+FLzb|Spn\d+MLxb|Spn\d+MLyb|Spn\d+MLzb)(\d)$") + + +def blade_permutation(name, nblades=3): + """Map a CW channel name to the mirrored run's equivalent channel. + + Mirroring reverses the blade sweep order: blade 1 stays put and the rest + reverse, so for three blades 2 and 3 swap. + """ + def swap(k): + return 1 if k == 1 else nblades - k + 2 + + m = ED_BLADE_PREFIX.match(name) + if m: + k = int(m.group(2)) + if 1 <= k <= nblades: + return f"{m.group(1)}{swap(k)}" + return name + + m = re.match(r"^B(\d+)([A-Za-z].*)$", name) + if not m: + return name + k = int(m.group(1)) + if k < 1 or k > nblades: + return name + return f"B{swap(k)}{m.group(2)}" + + +def classify(x, y, tol, floor): + """Return (class, residual) for one channel pair.""" + peak = np.abs(x).max() + if peak < floor: + return "negligible", 0.0 + den = max(peak, 1e-12) + rs = np.abs(y - x).max() / den + if rs < tol: + return "S", rs + rf = np.abs(y + x).max() / den + if rf < tol: + return "F", rf + # Wrapped angle. Scaled by the same denominator as the tests above, otherwise a + # 1/360 normalisation makes this far more lenient and it shadows a genuine flip. + # Only meaningful for a quantity actually measured in degrees: the residual can + # never exceed 180, so for a large channel this test passes on magnitude alone + # and will happily label a mooring tension a mirrored angle. + if den <= 400.0: + ra = np.abs(((y + x + 180.0) % 360.0) - 180.0).max() / den + if ra < tol: + return "A", ra + return "?", min(rs, rf) + + +def compare(cw_path, mir_path, tol=1e-6, permute=False, only=None): + """Return (nchecked, mismatches, unclassified, observed).""" + n1, a = load(cw_path) + n2, b = load(mir_path) + if n1 != n2: + raise ValueError("channel lists differ between the two files") + idx = {k: v for v, k in enumerate(n1)} + sl = slice(int(0.75 * len(a)), None) + + # Channels that are zero by symmetry still carry cancellation error; they must + # not be judged against their own magnitude. Keep this well below the smallest + # channel that carries real signal. + floor = 1e-9 * np.abs(a[sl, 1:]).max() + + checked, bad, unknown, observed = 0, [], [], {} + for ch in n1: + if ch == "Time": + continue + if only is not None and not any(re.search(p, ch) for p in only): + continue + mate = blade_permutation(ch) if permute else ch + if mate not in idx: + continue + got, rel = classify(a[sl, idx[ch]], b[sl, idx[mate]], tol, floor) + observed[ch] = got + if any(re.search(p, ch) for p in INFORMATIONAL): + continue + if got == "?": + unknown.append((ch, rel)) + exp = EXPECT.get(ch) + if exp is not None and got != "negligible": + checked += 1 + if got != exp: + bad.append((ch, exp, got, rel)) + return checked, bad, unknown, observed + + +def main(): + args = [a for a in sys.argv[1:] if not a.startswith("--")] + tol = float(sys.argv[sys.argv.index("--tol") + 1]) if "--tol" in sys.argv else 1e-6 + permute = "--permute" in sys.argv + checked, bad, unknown, observed = compare(args[0], args[1], tol, permute) + + if "--all" in sys.argv: + for ch, cls in observed.items(): + print(f" {ch:14s} {cls}") + + print(f"channels checked : {checked}" + + (" (blade permutation on)" if permute else "")) + for ch, rel in unknown: + print(f" UNCLASSIFIED {ch:14s} rel={rel:.3e}") + for ch, exp, got, rel in bad: + print(f" MISMATCH {ch:14s} expected {exp}, got {got} rel={rel:.3e}") + if bad or unknown: + sys.exit(1) + print("ALL PASS - every channel is SAME, FLIP, mirrored angle, or negligible") + + +if __name__ == "__main__": + main() diff --git a/reg_tests/otherTests/dump_outlist_xlsx.py b/reg_tests/otherTests/dump_outlist_xlsx.py new file mode 100644 index 0000000000..fda8b7d611 --- /dev/null +++ b/reg_tests/otherTests/dump_outlist_xlsx.py @@ -0,0 +1,92 @@ +#!/usr/bin/env python3 +"""Dump rows from OutListParameters.xlsx without needing openpyxl. + +An xlsx is a zip of XML, so the sheet can be read directly. Used to give exact +row numbers for the OutListParameters edits. + +Usage: dump_outlist_xlsx.py [CHANNEL ...] + dump_outlist_xlsx.py --tabs +""" +import os +import re +import sys +import zipfile +from xml.etree import ElementTree as ET + +REPO_ROOT = os.environ.get("OPENFAST_REPO") or os.path.dirname( + os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +XLSX = os.path.join(REPO_ROOT, "docs", "OtherSupporting", "OutListParameters.xlsx") +NS = "{http://schemas.openxmlformats.org/spreadsheetml/2006/main}" +RNS = "{http://schemas.openxmlformats.org/officeDocument/2006/relationships}" + + +def load(): + z = zipfile.ZipFile(XLSX) + strings = [] + if "xl/sharedStrings.xml" in z.namelist(): + root = ET.fromstring(z.read("xl/sharedStrings.xml")) + for si in root.findall(f"{NS}si"): + strings.append("".join(t.text or "" for t in si.iter(f"{NS}t"))) + wb = ET.fromstring(z.read("xl/workbook.xml")) + rels = ET.fromstring(z.read("xl/_rels/workbook.xml.rels")) + target = {r.get("Id"): r.get("Target") for r in rels} + sheets = {} + for sh in wb.find(f"{NS}sheets"): + rid = sh.get(f"{RNS}id") + path = target[rid] + if not path.startswith("xl/"): + path = "xl/" + path.lstrip("/") + sheets[sh.get("name")] = path + return z, strings, sheets + + +def cells(z, strings, path): + root = ET.fromstring(z.read(path)) + out = {} + for row in root.iter(f"{NS}row"): + r = int(row.get("r")) + vals = {} + for c in row.findall(f"{NS}c"): + ref = c.get("r") + col = re.match(r"([A-Z]+)", ref).group(1) + v = c.find(f"{NS}v") + isel = c.find(f"{NS}is") + if c.get("t") == "s" and v is not None: + vals[col] = strings[int(v.text)] + elif isel is not None: + vals[col] = "".join(t.text or "" for t in isel.iter(f"{NS}t")) + elif v is not None: + vals[col] = v.text + if vals: + out[r] = vals + return out + + +def main(): + z, strings, sheets = load() + if "--tabs" in sys.argv: + for name in sheets: + print(name) + return + + tab = sys.argv[1] + if tab not in sheets: + sys.exit(f"tab {tab!r} not found; have: {', '.join(sheets)}") + rows = cells(z, strings, sheets[tab]) + wanted = [a.upper() for a in sys.argv[2:]] + + for r in sorted(rows): + vals = rows[r] + joined = " | ".join(f"{k}:{v}" for k, v in sorted(vals.items())) + if not wanted: + print(f"{r:5d} {joined[:200]}") + continue + for w in wanted: + if any(str(v).strip().upper() == w for v in vals.values()): + print(f"{r:5d} {joined[:220]}") + break + + +if __name__ == "__main__": + main() diff --git a/reg_tests/otherTests/emit_sign_table.py b/reg_tests/otherTests/emit_sign_table.py new file mode 100644 index 0000000000..f4067c59be --- /dev/null +++ b/reg_tests/otherTests/emit_sign_table.py @@ -0,0 +1,196 @@ +#!/usr/bin/env python3 +"""Measure the observed mirror sign of every output channel across all registered pairs. + +The sign table in mirror_rotor.rst claims to be measured rather than asserted, so +it should be generated rather than edited by hand. This reads each clockwise / +mirrored pair, classifies every channel, and reports the aggregate. A channel seen +in more than one pair must agree across them; disagreements are reported rather +than silently resolved. +""" +import argparse +import os +import re +import sys +from collections import Counter, defaultdict + +import numpy as np + +REPO_ROOT = os.environ.get("OPENFAST_REPO") or os.path.dirname( + os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) +sys.path.insert(0, os.path.join(REPO_ROOT, "reg_tests", "lib")) +from compare_mirror import classify # noqa: E402 +import pass_fail # noqa: E402 + +R = os.path.join(REPO_ROOT, "reg_tests", "r-test") +GC = f"{R}/glue-codes/openfast" + +# label, clockwise case, mirrored case, blades +FILE_PAIRS = [ + ("ElastoDyn + AeroDyn", "5MW_Land_noDLL_Steady_CW", + "5MW_Land_noDLL_Steady_MirrorRotor", 3), + ("BeamDyn blades", "5MW_Land_BD_noDLL_Steady_CW", + "5MW_Land_BD_noDLL_Steady_MirrorRotor", 3), + ("MHK buoyancy", "MHK_RM1_Floating_Steady_CW", + "MHK_RM1_Floating_Steady_MirrorRotor", 2), + ("AeroDisk, yawed", "5MW_Land_ADsk_SED_Yaw_CW", + "5MW_Land_ADsk_SED_Yaw_MirrorRotor", 3), +] + +# label, single output file, per-rotor channel prefixes, blades +WITHIN_PAIRS = [ + ("AeroDyn nodal outputs", + os.path.join(REPO_ROOT, "build-docker-double", "reg_tests", "modules", + "aerodyn", "ad_MultipleHAWT_MirrorRotor", "ad_driver.T1.outb"), + os.path.join(REPO_ROOT, "build-docker-double", "reg_tests", "modules", + "aerodyn", "ad_MultipleHAWT_MirrorRotor", "ad_driver.T2.outb"), + None, 3), + ("Twin-rotor semisubmersible", + f"{GC}/5MW_MRSemi_DLL_WSt_WavesIrr_MirrorRotor/" + "5MW_MRSemi_DLL_WSt_WavesIrr_MirrorRotor.outb", + None, ("R1", "R2"), 3), +] + + +def swap_blades(name, nblades): + """Blade 1 lies on the mirror plane; the others exchange in reverse order.""" + if nblades < 3: + return name + order = {"1": "1", "2": "3", "3": "2"} + # AeroDyn module and nodal blade channels: B2N003Fn, AB2N003Fn + m = re.match(r"^(A?)B([123])(N\d+.*)$", name) + if m: + return f"{m.group(1)}B{order[m.group(2)]}{m.group(3)}" + # Any other per-blade channel named B: B2RootFxr, B2TipTDxr, + # B2AeroPwr. Must follow the node pattern above, which is more specific. + m = re.match(r"^B([123])([A-Za-z].*)$", name) + if m: + return f"B{order[m.group(1)]}{m.group(2)}" + # ElastoDyn trailing-index channels: RootMxc2, OoPDefl3 + m = re.match(r"^(.*?[A-Za-z])([123])$", name) + if m and not re.search(r"\d$", m.group(1)): + return m.group(1) + order[m.group(2)] + return name + + +# Mooring lines and connections exchange in mirror pairs as well, but the pairing +# depends on the layout. Reported separately rather than guessed at. +MOORING = re.compile(r"^(FAIRTEN|ANCHTEN|CON\d|L\d+N|M\d+N|P\d+F)") + + +def measure(a, na, b, nb, nblades, tol, floor): + out = {} + idx = {n: i for i, n in enumerate(nb)} + for i, n in enumerate(na): + j = idx.get(swap_blades(n, nblades), idx.get(n)) + if j is None: + continue + cls, res = classify(a[:, i], b[:, j], tol, floor) + out[n] = (cls, res) + return out + + +def main(): + ap = argparse.ArgumentParser() + ap.add_argument("--tol", type=float, default=2e-3) + ap.add_argument("--floor", type=float, default=1e-8) + ap.add_argument("--show-unresolved", action="store_true") + a = ap.parse_args() + + seen = defaultdict(set) + origin = defaultdict(set) + + for label, cw, mir, nb_ in FILE_PAIRS: + pa, pb = f"{GC}/{cw}/{cw}.outb", f"{GC}/{mir}/{mir}.outb" + if not (os.path.exists(pa) and os.path.exists(pb)): + print(f" skip {label}: missing baseline", file=sys.stderr) + continue + da, ia, _ = pass_fail.readFASTOut(pa) + db, ib, _ = pass_fail.readFASTOut(pb) + res = measure(da, list(ia["attribute_names"]), db, + list(ib["attribute_names"]), nb_, a.tol, a.floor) + c = Counter(v[0] for v in res.values()) + print(f"{label:28s} same={c['S']:4d} flipped={c['F']:3d} " + f"wrapped={c['A']:3d} negligible={c['negligible']:3d} " + f"unresolved={c['?']:3d}") + for n, (cl, _) in res.items(): + seen[n].add(cl) + origin[n].add(label) + + for label, pa, pb, prefixes, nb_ in WITHIN_PAIRS: + if not os.path.exists(pa): + print(f" skip {label}: missing output", file=sys.stderr) + continue + da, ia, _ = pass_fail.readFASTOut(pa) + if pb: + db, ib, _ = pass_fail.readFASTOut(pb) + na, nbn = list(ia["attribute_names"]), list(ib["attribute_names"]) + else: + db, ib = da, ia + na = nbn = list(ia["attribute_names"]) + if prefixes: + p1, p2 = prefixes + na2 = [n for n in na if n.startswith(p1)] + res = {} + idx = {n: i for i, n in enumerate(nbn)} + for n in na2: + base = n[len(p1):] + j = idx.get(p2 + swap_blades(base, nb_), idx.get(p2 + base)) + if j is None: + continue + cls, r = classify(da[:, na.index(n)], db[:, j], a.tol, a.floor) + res[base] = (cls, r) + else: + res = measure(da, na, db, nbn, nb_, a.tol, a.floor) + c = Counter(v[0] for v in res.values()) + print(f"{label:28s} same={c['S']:4d} flipped={c['F']:3d} " + f"wrapped={c['A']:3d} negligible={c['negligible']:3d} " + f"unresolved={c['?']:3d}") + for n, (cl, _) in res.items(): + seen[n].add(cl) + origin[n].add(label) + + # A channel measured in several pairs must agree; 'negligible' carries no + # information, so it never contradicts a real observation. + groups = defaultdict(list) + conflicts = [] + mooring = [] + for n, classes in sorted(seen.items()): + if MOORING.match(n): + mooring.append(n) + continue + real = classes - {"negligible", "?"} + if len(real) > 1: + conflicts.append((n, sorted(real), sorted(origin[n]))) + elif len(real) == 1: + groups[real.pop()].append(n) + elif "?" in classes: + groups["?"].append(n) + else: + groups["negligible"].append(n) + + print("\n=== channel counts by observed behaviour") + for k, lbl in (("S", "identical"), ("F", "sign-flipped"), + ("A", "mirrored angle"), ("negligible", "always ~zero"), + ("?", "unresolved")): + print(f" {lbl:16s} {len(groups[k])}") + print(f" mooring, set aside {len(mooring)}") + + if conflicts: + print("\n=== CONFLICTS (same channel, different behaviour between pairs)") + for n, cl, src in conflicts: + print(f" {n:20s} {cl} seen in {src}") + + if a.show_unresolved and groups["?"]: + print("\n=== unresolved") + print(" " + ", ".join(groups["?"])) + + for k, lbl in (("S", "IDENTICAL"), ("F", "SIGN-FLIPPED"), + ("A", "MIRRORED ANGLE")): + print(f"\n=== {lbl}") + print(" " + ", ".join(groups[k])) + + +if __name__ == "__main__": + main() diff --git a/reg_tests/otherTests/fix_dvr_comment.py b/reg_tests/otherTests/fix_dvr_comment.py new file mode 100644 index 0000000000..287b2612f3 --- /dev/null +++ b/reg_tests/otherTests/fix_dvr_comment.py @@ -0,0 +1,52 @@ +"""Fix the BasicHAWTFormat comment, and add the missing MirrorRotor input. + +The comment claimed the basic inputs were the next 7 lines. There are 8, from +BaseOriginInit to Twr2Shft, and MirrorRotor now sits between the flag and them, +so a positional description is doubly wrong. Describe the range by name instead. + +The two example files under docs/ never gained the MirrorRotor input that the +driver now requires, so anyone copying one would have written a file the driver +rejects. +""" +import os +import re +import pathlib + +ROOT = pathlib.Path(os.environ.get("OPENFAST_REPO") or + pathlib.Path(__file__).resolve().parents[2]) + +OLD = "True: next 7 lines are basic inputs, False:" +NEW = "True: basic HAWT inputs BaseOriginInit to Twr2Shft, False:" + +MIRROR = ("False MirrorRotor({n}) - Flag indicating the rotor rotation " + "direction is mirrored (counter-clockwise viewed from upwind)") + +EXAMPLES = [ROOT / "docs/source/user/aerodyn/examples/ad_driver_example.dvr", + ROOT / "docs/source/user/aerodyn/examples/ad_driver_multiple.dvr"] + +added = 0 +for path in EXAMPLES: + lines = path.read_text().split("\n") + out = [] + for line in lines: + out.append(line) + m = re.match(r"\s*\S+\s+BasicHAWTFormat\((\d+)\)", line) + if m: + out.append(MIRROR.format(n=m.group(1))) + added += 1 + path.write_text("\n".join(out)) +print(f"added {added} MirrorRotor lines") + +fixed = 0 +for path in ROOT.rglob("*"): + if not path.is_file() or "/build" in str(path): + continue + if path.suffix not in (".dvr", ".rst"): + continue + text = path.read_text(errors="replace") + if OLD not in text: + continue + path.write_text(text.replace(OLD, NEW)) + fixed += 1 + print(f" {path.relative_to(ROOT)}") +print(f"reworded {fixed} files") diff --git a/reg_tests/otherTests/make_adsk_lateral_table.py b/reg_tests/otherTests/make_adsk_lateral_table.py new file mode 100644 index 0000000000..a8632b1cd4 --- /dev/null +++ b/reg_tests/otherTests/make_adsk_lateral_table.py @@ -0,0 +1,33 @@ +"""Derive an AeroDisk coefficient table that carries lateral coefficients. + +The shipped 5MW table has C_Fy, C_Fz, C_My and C_Mz identically zero, so the +mirror-related sign factors on Force(2), Force(3), Moment(2) and Moment(3) - +and the z_hat pseudovector flip that multiplies them - never execute. This +scales the lateral columns off the axial ones so every component is non-zero +while keeping the TSR and pitch dependence of the original. + +The ratios are arbitrary but fixed; the table is a regression fixture, not a +physical rotor. +""" +import io, sys + +RATIO = {6: -0.08, 7: 0.05, 9: 0.06, 10: -0.04} # col idx -> factor +SRC_COL = {6: 5, 7: 5, 9: 8, 10: 8} # lateral col -> driving col + +def main(src, dst): + out = [] + for n, line in enumerate(io.open(src, encoding="utf-8")): + s = line.rstrip("\n") + if n < 3 or not s.strip() or s.lstrip().startswith("#"): + out.append(s); continue + f = [c.strip() for c in s.split(",")] + if len(f) < 11: + out.append(s); continue + for col, fac in RATIO.items(): + f[col] = "%10.4f" % (fac * float(f[SRC_COL[col]])) + out.append(", ".join("%10s" % c for c in f)) + io.open(dst, "w", encoding="utf-8").write("\n".join(out) + "\n") + print("wrote", dst, len(out), "lines") + +if __name__ == "__main__": + main(sys.argv[1], sys.argv[2]) diff --git a/reg_tests/otherTests/make_rtest_cases.py b/reg_tests/otherTests/make_rtest_cases.py new file mode 100644 index 0000000000..d65e31c451 --- /dev/null +++ b/reg_tests/otherTests/make_rtest_cases.py @@ -0,0 +1,193 @@ +#!/usr/bin/env python3 +"""Generate the Phase 1 mirrored-rotor regression cases in r-test. + +Creates 5MW_Land_noDLL_Steady_CW and 5MW_Land_noDLL_Steady_MirrorRotor from the +5MW land baseline. The pair is identical apart from the MirrorRotor flag, which +is the whole point: the mirrored deck describes the same clockwise turbine. + +Case design, and why each choice is there: + CompServo = 0 ServoDyn is still guard-railed for mirrored rotors + GenDOF = True free drivetrain, so shaft torque actually matters + ModCoupling = 1 SignLSSTrq is only reached from the loose-coupling + integrators, so tight coupling cannot exercise the + gearbox efficiency direction at all + GBoxEff = 95 the baseline 100% makes both branches of the efficiency + factor identical and hides errors in that direction test + ShftTilt = -5 inherited from the baseline; gives azimuthal variation so + the blades are not interchangeable + steady 8 m/s, TMax 20 s, flexible blades and tower + +Usage: make_rtest_cases.py [--write] +""" +import os +import re +import shutil +import sys + +REPO_ROOT = os.environ.get("OPENFAST_REPO") or os.path.dirname( + os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +RTEST = os.path.join(REPO_ROOT, "reg_tests", "r-test", "glue-codes", "openfast") +ED_SRC = os.path.join(RTEST, "5MW_Land_DLL_WTurb") +BD_SRC = os.path.join(RTEST, "5MW_Land_BD_DLL_WTurb") + +# name -> (mirrored, beamdyn) +CASES = {"5MW_Land_noDLL_Steady_CW": (False, False), + "5MW_Land_noDLL_Steady_MirrorRotor": (True, False), + "5MW_Land_BD_noDLL_Steady_CW": (False, True), + "5MW_Land_BD_noDLL_Steady_MirrorRotor": (True, True)} + +OUTLIST = """"RotSpeed" +"RotAccel" +"Azimuth" +"GenSpeed" +"GenAccel" +"LSSTipVxa" +"LSSTipAxa" +"LSSTipPxa" +"LSShftMxa" +"LSSGagMxa" +"RotTorq" +"LSShftTq" +"HSShftTq" +"HSShftPwr" +"RotPwr" +"RotThrust" +"LSShftFxa" +"LSShftFya" +"LSShftFza" +"LSSTipMya" +"LSSTipMza" +"YawBrFxp" +"YawBrFyp" +"YawBrFzp" +"YawBrMxp" +"YawBrMyp" +"YawBrMzp" +"OoPDefl1" +"IPDefl1" +"TipDxc1" +"TipDyc1" +"RootFxc1" +"RootFyc1" +"RootMxc1" +"RootMyc1" +"RootMzc1" +"OoPDefl2" +"IPDefl2" +"RootMxc2" +"RootMyc2" +"OoPDefl3" +"IPDefl3" +"RootMxc3" +"RootMyc3" +"TwrBsFxt" +"TwrBsFyt" +"TwrBsMxt" +"TwrBsMyt" +"TwrBsMzt" +""" + +AD_OUTLIST = """"RtAeroFxh" +"RtAeroMxh" +"RtAeroPwr" +"RtTSR" +"RtSkew" +"B1N1Alpha" +"B1N2Alpha" +"B1N3Alpha" +"B1N1Theta" +"B1N2Theta" +"B1N3Theta" +"B1N1Fn" +"B1N2Fn" +"B1N3Fn" +"B1N1Ft" +"B1N2Ft" +"B1N3Ft" +""" + + +def set_var(text, var, value): + pat = re.compile(r"^(\s*)(\S+)(\s+" + re.escape(var) + r"\s)", re.MULTILINE) + new, n = pat.subn(lambda m: f"{m.group(1)}{value}{m.group(3)}", text, count=1) + if n != 1: + raise KeyError(f"could not set {var!r}") + return new + + +def swap_outlist(text, entries, marker="OutList"): + head, _, rest = text.partition(marker) + _, _, tail = rest.partition("END of OutList section") + return head + marker + " - Output channels\n" + entries + "END of OutList section" + tail + + +def build(case, mirrored, beamdyn, write): + src = BD_SRC if beamdyn else ED_SRC + dst = os.path.join(RTEST, case) + if write: + # Only the generated files are replaced. Hand-written README.md files and the + # committed .outb baselines are left alone, so re-running this does not quietly + # delete them. + os.makedirs(dst, exist_ok=True) + + ed_name = ("NRELOffshrBsline5MW_Onshore_ElastoDyn_BDoutputs.dat" if beamdyn + else "NRELOffshrBsline5MW_Onshore_ElastoDyn.dat") + ed = open(os.path.join(src, ed_name)).read() + ed = set_var(ed, "GenDOF", "True") + ed = set_var(ed, "YawDOF", "False") + ed = set_var(ed, "RotSpeed", "9.15") + ed = set_var(ed, "GBoxEff", "95.0") + for k in (1, 2, 3): + ed = set_var(ed, f"BlPitch({k})", "1.0") + ed = swap_outlist(ed, OUTLIST) + + ad = open(os.path.join(src, "NRELOffshrBsline5MW_Onshore_AeroDyn.dat")).read() + ad = set_var(ad, "NBlOuts", "3") + ad = swap_outlist(ad, AD_OUTLIST, "OutList ") + + fst_name = ("5MW_Land_BD_DLL_WTurb.fst" if beamdyn else "5MW_Land_DLL_WTurb.fst") + fst = open(os.path.join(src, fst_name)).read() + fst = set_var(fst, "TMax", "20") + fst = set_var(fst, "Echo", "False") + # BeamDyn is unstable with loose coupling, so only the ElastoDyn pair uses it. That + # costs the BeamDyn pair the gearbox-efficiency path, which the ElastoDyn pair covers. + if not beamdyn: + fst = set_var(fst, "ModCoupling", "1") + fst = set_var(fst, "CompServo", "0") + fst = set_var(fst, "CompInflow", "1") + fst = set_var(fst, "MirrorRotor", "True" if mirrored else "False") + fst = set_var(fst, "EDFile", '"ElastoDyn.dat"') + fst = set_var(fst, "AeroFile", '"AeroDyn.dat"') + fst = set_var(fst, "InflowFile", + '"../5MW_Baseline/NRELOffshrBsline5MW_InflowWind_Steady8mps.dat"') + fst = set_var(fst, "OutFileFmt", "2") + + files = { + "ElastoDyn.dat": ed, + "AeroDyn.dat": ad, + f"{case}.fst": fst, + } + if write: + for name, text in files.items(): + open(os.path.join(dst, name), "w").write(text) + shutil.copy(os.path.join(src, "NRELOffshrBsline5MW_Onshore_ElastoDyn_Tower.dat"), + os.path.join(dst, "ElastoDyn_Tower.dat")) + ed2 = open(os.path.join(dst, "ElastoDyn.dat")).read() + ed2 = set_var(ed2, "TwrFile", '"ElastoDyn_Tower.dat"') + open(os.path.join(dst, "ElastoDyn.dat"), "w").write(ed2) + print(f" {case:40s} MirrorRotor={'True' if mirrored else 'False':5s} " + f"{'BeamDyn' if beamdyn else 'ElastoDyn':9s} " + f"{'written' if write else '(dry run)'}") + + +def main(): + write = "--write" in sys.argv + for case, (mirrored, beamdyn) in CASES.items(): + build(case, mirrored, beamdyn, write) + if not write: + print("\ndry run; pass --write to create the cases") + + +if __name__ == "__main__": + main() diff --git a/reg_tests/otherTests/mirror_bts.py b/reg_tests/otherTests/mirror_bts.py new file mode 100644 index 0000000000..219165c4dc --- /dev/null +++ b/reg_tests/otherTests/mirror_bts.py @@ -0,0 +1,35 @@ +#!/usr/bin/env python3 +"""Create a mirror-image (across the XZ plane, i.e. Y -> -Y) copy of a TurbSim +.bts full-field wind file. + +Usage: + python3 mirror_bts.py +""" +import sys + +import bts_io + + +def main(): + if len(sys.argv) != 3: + print(__doc__) + sys.exit(1) + + in_path, out_path = sys.argv[1], sys.argv[2] + + print(f"Reading {in_path} ...") + bts = bts_io.read_bts(in_path) + print(f" FileID={bts.FileID} NYGrids={bts.NYGrids} NZGrids={bts.NZGrids} " + f"NTGrids={bts.NTGrids} NSteps={bts.NSteps} dy={bts.dy} dz={bts.dz} dt={bts.dt}") + print(f" DescStr: {bts.DescStr!r}") + + print("Mirroring across XZ plane (Y -> -Y; reversing Y grid index, flipping V sign)...") + mirrored = bts_io.mirror_xz(bts, note="Mirrored across XZ plane (Y -> -Y; V-component sign flipped) for comparison testing.") + + print(f"Writing {out_path} ...") + bts_io.write_bts(out_path, mirrored) + print("Done.") + + +if __name__ == "__main__": + main() diff --git a/reg_tests/otherTests/mr_two_rotor.py b/reg_tests/otherTests/mr_two_rotor.py new file mode 100644 index 0000000000..9c449d1250 --- /dev/null +++ b/reg_tests/otherTests/mr_two_rotor.py @@ -0,0 +1,120 @@ +#!/usr/bin/env python3 +"""Compare rotor 1 against rotor 2 inside one multi-rotor OpenFAST run. + +The glue code prefixes per-rotor channels with R1/R2. When rotor 1 is clockwise +and rotor 2 is mirrored, and the platform, substructure, mooring and sea are all +symmetric about y = 0, the whole system maps onto itself under y -> -y, so R2 +must be the mirror image of R1 within the same solve. + +Blade 1 lies on the mirror plane at azimuth 0, so blades 2 and 3 exchange. + +Shared (unprefixed) channels belong to the single platform. Under a symmetric +solution the antisymmetric ones must vanish, which is a much sharper statement +than any pairwise comparison, so they are reported separately. +""" +import argparse +import os +import re +import sys +from collections import Counter + +import numpy as np + +REPO_ROOT = os.environ.get("OPENFAST_REPO") or os.path.dirname( + os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +sys.path.insert(0, os.path.join(os.path.dirname(__file__))) +from compare_mirror import classify # noqa: E402 + +sys.path.insert(0, os.path.join(REPO_ROOT, "reg_tests", "lib")) +import pass_fail # noqa: E402 + +# Platform quantities that must be zero in a solution symmetric about y = 0. +ANTISYM_SHARED = ("HydroFyi", "HydroMxi", "HydroMzi", + "RBTDYss", "RBRDXss", "RBRDZss") +SYM_SHARED = ("HydroFxi", "HydroFzi", "HydroMyi", + "RBTDXss", "RBTDZss", "RBRDYss") + +BLADE_RE = re.compile(r"^(.*?)([123])(N\d+)?(.*)$") + + +def swap_blade(name): + """Exchange blades 2 and 3; blade 1 sits on the mirror plane.""" + for pat, rep in ((r"^B2N", "B3N"), (r"^B3N", "B2N")): + if re.match(pat, name): + return re.sub(pat, rep, name) + m = re.match(r"^(Root[A-Za-z]+)([123])$", name) + if m: + return m.group(1) + {"1": "1", "2": "3", "3": "2"}[m.group(2)] + m = re.match(r"^(.*?)([123])$", name) + if m and m.group(1).startswith(("OoPDefl", "IPDefl", "TwstDefl", "BldPitch", + "TipDx", "TipDy", "TipClrnc")): + return m.group(1) + {"1": "1", "2": "3", "3": "2"}[m.group(2)] + return name + + +def main(): + ap = argparse.ArgumentParser() + ap.add_argument("outb") + ap.add_argument("--tol", type=float, default=1e-6) + ap.add_argument("--floor", type=float, default=1e-8) + ap.add_argument("--start", type=float, default=0.0) + ap.add_argument("--show", action="store_true", + help="list every channel and its observed class") + a = ap.parse_args() + + data, info, _ = pass_fail.readFASTOut(a.outb) + names = list(info["attribute_names"]) + t = data[:, 0] + k = t >= a.start + col = {n: data[k, i] for i, n in enumerate(names)} + + r1 = {n[2:]: n for n in names if n.startswith("R1")} + r2 = {n[2:]: n for n in names if n.startswith("R2")} + + counts, unresolved, rows = Counter(), [], [] + for base in sorted(r1): + partner = swap_blade(base) + if partner not in r2: + counts["missing"] += 1 + continue + cls, res = classify(col[r1[base]], col[r2[partner]], a.tol, a.floor) + counts[cls] += 1 + rows.append((base, partner, cls, res)) + if cls == "?": + unresolved.append((base, partner, res, + np.abs(col[r1[base]]).max(), + np.abs(col[r2[partner]]).max())) + + label = {"S": "same", "F": "flipped", "A": "angle-wrapped", + "negligible": "negligible", "?": "unresolved"} + print(f"--- rotor 1 vs rotor 2 ({a.outb})") + for key in ("S", "F", "A", "negligible", "?", "missing"): + if counts[key]: + print(f"{label.get(key, key):16s} {counts[key]}") + + if a.show: + for base, partner, cls, res in rows: + tag = base if base == partner else f"{base}->{partner}" + print(f" {tag:22s} {label.get(cls, cls):14s} {res:.3e}") + + if unresolved: + print("\nunresolved:") + for base, partner, res, p1, p2 in unresolved: + print(f" {base:20s} vs {partner:20s} res={res:.3e} " + f"peakR1={p1:.6g} peakR2={p2:.6g}") + + print("\n--- shared platform channels") + print(" (a solution symmetric about y=0 has zero antisymmetric response)") + for n in ANTISYM_SHARED: + if n in col: + print(f" {n:12s} peak {np.abs(col[n]).max():.6e} expect ~0") + for n in SYM_SHARED: + if n in col: + print(f" {n:12s} peak {np.abs(col[n]).max():.6e} expect nonzero") + + return 1 if unresolved else 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/reg_tests/otherTests/openfast_case_mirror.py b/reg_tests/otherTests/openfast_case_mirror.py new file mode 100644 index 0000000000..86ae4745ef --- /dev/null +++ b/reg_tests/otherTests/openfast_case_mirror.py @@ -0,0 +1,257 @@ +#!/usr/bin/env python3 +"""Clone an r-test OpenFAST case and run it clockwise and mirrored. + +Unlike openfast_mirror.py this changes *nothing* except the MirrorRotor flag, so +it is the right tool once ServoDyn is in the loop: the controller, its DLL and +every input file stay exactly as the clockwise case ships them. + +Usage: openfast_case_mirror.py [--tmax N] [--dump CH1,CH2] [--tol X] +""" +import os +import re +import shutil +import subprocess +import sys + +import numpy as np + +REPO_ROOT = os.environ.get("OPENFAST_REPO") or os.path.dirname( + os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) +REPO = REPO_ROOT +RTEST = f"{REPO}/reg_tests/r-test/glue-codes/openfast" +# Cases with a Bladed-style controller reference a DISCON library that is built, not +# stored, so it exists only under the build tree. Prefer that copy of a referenced +# sibling directory when it is there; ctest stages it from the r-test source. +STAGED = f"{REPO}/build-docker-double/reg_tests/glue-codes/openfast" +EXE = f"{REPO}/build-docker-double-debug/glue-codes/openfast/openfast" +WORK = os.path.join(os.environ.get("TMPDIR", "/tmp"), "of_case_mirror") + +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) +sys.path.insert(0, f"{REPO}/reg_tests/lib") +from compare_mirror import classify, blade_permutation # noqa: E402 +import fast_io # noqa: E402 + +DIAG = {"Time", "ConvError", "ConvIter", "NumUJac"} + + +def set_var(text, var, value): + pat = re.compile(r"^(\s*)(\S+)(\s+" + re.escape(var) + r"\s)", re.MULTILINE) + new, n = pat.subn(lambda m: f"{m.group(1)}{value}{m.group(3)}", text, count=1) + if n != 1: + raise KeyError(f"could not set {var!r}") + return new + + +def add_partner_channels(path, nblades): + """Ensure every blade-indexed output has its mirror partner in the OutList. + + A case that only prints blades 1 and 3 gives the mirrored run's blade 3 nothing + to be compared against, since it corresponds to the clockwise run's blade 2. + """ + txt = open(path, errors="replace").read() + lines = txt.split("\n") + cand = [i for i, l in enumerate(lines) if "outlist" in l.lower() and '"' not in l] + if not cand: + return + # These files carry a second, usually empty, nodal-output OutList at the end. + start = cand[0] + end = next((i for i in range(start, len(lines)) if lines[i].strip().upper().startswith("END")), None) + if end is None: + return + + have, order = set(), [] + for i in range(start + 1, end): + for ch in re.findall(r'"([^"]+)"', lines[i]): + for c in ch.split(","): + c = c.strip() + if c: + have.add(c) + order.append(c) + + add = [] + for c in order: + mate = blade_permutation(c, nblades) + if mate != c and mate not in have: + have.add(mate) + add.append(mate) + if not add: + return + + lines[end:end] = [f'"{c}"' for c in add] + open(path, "w").write("\n".join(lines)) + + +def negate_vars(d, names): + """Negate asymmetric scalar inputs in the mirrored clone. + + Quantities such as an initial nacelle yaw or a wind direction are ordinary + asymmetric inputs, not rotor-convention ones, so mirroring the turbine does not + mirror them. A symmetry test has to mirror them by hand. + """ + for f in sorted(os.listdir(d)): + if not f.lower().endswith((".dat", ".fst")): + continue + p = os.path.join(d, f) + txt = open(p, errors="replace").read() + orig = txt + for var in names: + pat = re.compile(r"^(\s*)(-?[\d.]+(?:[eEdD][-+]?\d+)?)(\s+" + re.escape(var) + r"\s)", + re.MULTILINE) + txt = pat.sub(lambda m: f"{m.group(1)}{-float(m.group(2)):g}{m.group(3)}", txt) + if txt != orig: + open(p, "w").write(txt) + + +def mirror_series(d, names): + """Apply the mirror to a prescribed force/moment series (t, FX..MZ). + + Under S = diag(1, -1, 1) the true vector components FY flips, and for the moment + pseudovector MX and MZ flip instead. + """ + sign = [1.0, 1.0, -1.0, 1.0, -1.0, 1.0, -1.0] + for f in names: + p = os.path.join(d, f) + if not os.path.exists(p): + sys.exit(f"no such series file: {f}") + out = [] + for line in open(p, errors="replace").read().split("\n"): + if line.lstrip().startswith(("#", "!")): + out.append(line) + continue + # Rows may carry a trailing inline comment. + cut = min((i for i in (line.find("#"), line.find("!")) if i >= 0), default=len(line)) + body, tail = line[:cut], line[cut:] + parts = body.split() + if len(parts) != len(sign): + out.append(line) + continue + try: + vals = [float(x) for x in parts] + except ValueError: + out.append(line) + continue + out.append(" ".join(f"{s*v:.8E}" for s, v in zip(sign, vals)) + (" " + tail if tail else "")) + open(p, "w").write("\n".join(out)) + + +def build(case, mirrored, tmax, negate=(), series=(), reuse=False): + name = "mir" if mirrored else "cw" + d = os.path.join(WORK, f"{case}_{name}") + if reuse and os.path.exists(os.path.join(d, f"{case}.out")): + return os.path.join(d, f"{case}.out") + os.makedirs(WORK, exist_ok=True) + # Sibling directories are referenced by relative path from the case folder. + for entry in os.listdir(RTEST): + link = os.path.join(WORK, entry) + if not os.path.exists(link): + staged = os.path.join(STAGED, entry) + os.symlink(staged if os.path.isdir(staged) else os.path.join(RTEST, entry), link) + + d = os.path.join(WORK, f"{case}_{name}") + shutil.rmtree(d, ignore_errors=True) + shutil.copytree(os.path.join(RTEST, case), d) + + fst = os.path.join(d, f"{case}.fst") + txt = open(fst).read() + txt = set_var(txt, "MirrorRotor", "True" if mirrored else "False") + txt = set_var(txt, "OutFileFmt", "1") + if tmax is not None: + txt = set_var(txt, "TMax", str(tmax)) + open(fst, "w").write(txt) + + # Give every blade-indexed channel a partner to be compared against. + for f in os.listdir(d): + if not f.lower().endswith(".dat"): + continue + p = os.path.join(d, f) + body = open(p, errors="replace").read() + head = body[:400].upper() + if "ELASTODYN" in head or "AERODYN" in head: + m = re.search(r"^\s*(\d+)\s+NumBl\b", body, re.MULTILINE) + add_partner_channels(p, int(m.group(1)) if m else 3) + + if mirrored and negate: + negate_vars(d, negate) + if mirrored and series: + mirror_series(d, series) + + p = subprocess.run([EXE, f"{case}.fst"], cwd=d, capture_output=True, text=True) + out = os.path.join(d, f"{case}.out") + if not os.path.exists(out): + tail = [l for l in (p.stdout + p.stderr).split("\n") if l.strip()][-10:] + print("\n".join(tail)) + sys.exit(f"{name} run failed") + return out + + +def load(path): + lines = open(path, errors="replace").read().split("\n") + h = next(i for i, l in enumerate(lines) if l.strip().startswith("Time")) + names = lines[h].split() + rows = [[float(x) for x in l.split()] for l in lines[h + 2:] if l.strip()] + return names, np.array(rows) + + +def main(): + args = [a for a in sys.argv[1:] if not a.startswith("--")] + case = args[0] + tmax = float(sys.argv[sys.argv.index("--tmax") + 1]) if "--tmax" in sys.argv else None + tol = float(sys.argv[sys.argv.index("--tol") + 1]) if "--tol" in sys.argv else 1e-6 + reuse = "--reuse" in sys.argv + negate = sys.argv[sys.argv.index("--negate") + 1].split(",") if "--negate" in sys.argv else () + series = sys.argv[sys.argv.index("--mirror-series") + 1].split(",") if "--mirror-series" in sys.argv else () + + # Components that are not blades also permute under the mirror, but which ones pair up + # depends on the layout rather than on blade order -- the OC4 semi's mooring line 2 + # lies on the mirror plane, so lines 1 and 3 swap. State those pairings explicitly. + swap = {} + if "--swap" in sys.argv: + for pair in sys.argv[sys.argv.index("--swap") + 1].split(","): + a, _, b = pair.partition("=") + swap[a.strip()], swap[b.strip()] = b.strip(), a.strip() + + cw = build(case, False, tmax, negate, series, reuse) + mir = build(case, True, tmax, negate, series, reuse) + n1, a = load(cw) + n2, b = load(mir) + if n1 != n2: + sys.exit("channel lists differ") + idx = {k: v for v, k in enumerate(n1)} + sl = slice(int(0.25 * len(a)), None) + phys = [idx[c] for c in n1 if c not in DIAG] + floor = 1e-9 * np.abs(a[sl][:, phys]).max() + nb = int(sys.argv[sys.argv.index("--nblades") + 1]) if "--nblades" in sys.argv else 3 + + if "--dump" in sys.argv: + rows = list(range(0, len(a), max(1, len(a) // 14))) + for ch in sys.argv[sys.argv.index("--dump") + 1].split(","): + print(f"\n{ch}:") + print(f"{'t':>8s} {'CW':>14s} {'MIRROR':>14s}") + for r in rows: + print(f"{a[r,0]:8.3f} {a[r,idx[ch]]:14.6g} {b[r,idx[ch]]:14.6g}") + return + + groups = {} + for ch in n1: + if ch in DIAG: + continue + mate = swap.get(ch) or blade_permutation(ch, nb) + if mate not in idx: + mate = ch + got, rel = classify(a[sl, idx[ch]], b[sl, idx[mate]], tol, floor) + groups.setdefault(got, []).append((ch, rel)) + + for k in ("S", "F", "A", "negligible", "?"): + if groups.get(k): + print(f"{k:11s} ({len(groups[k]):3d}): {' '.join(c for c, _ in groups[k])}") + bad = groups.get("?", []) + if bad: + print(f"\nFAIL: {len(bad)} channel(s) unresolved") + for c, r in bad[:10]: + print(f" {c:14s} rel={r:.3e}") + sys.exit(1) + print("\nPASS: every channel resolves") + + +if __name__ == "__main__": + main() diff --git a/reg_tests/otherTests/openfast_mirror.py b/reg_tests/otherTests/openfast_mirror.py new file mode 100644 index 0000000000..4a48f1dc9f --- /dev/null +++ b/reg_tests/otherTests/openfast_mirror.py @@ -0,0 +1,307 @@ +#!/usr/bin/env python3 +"""Phase 1.2/1.3: build and run the OpenFAST clockwise/mirrored pair. + +Builds the pair in scratch from the 5MW land baseline so r-test stays clean until +the case is settled. ServoDyn is off because the mirrored ServoDyn interface is +Phase 3 and is still guard-railed, so the rotor runs at a fixed speed and the +comparison isolates the aerodynamic and structural mirror. + +By default this reports the *measured* symmetry of every channel rather than +asserting a table, which is how the sign map in CONVENTIONS is meant to be built. +Pass --check to assert the expectations in ED_EXPECT once they are settled. + +Usage: openfast_mirror.py [--check] [--tmax 20] +""" +import os +import re +import shutil +import subprocess +import sys + +import numpy as np + +REPO_ROOT = os.environ.get("OPENFAST_REPO") or os.path.dirname( + os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) +REPO = REPO_ROOT +RTEST = f"{REPO}/reg_tests/r-test/glue-codes/openfast" +SRC = f"{RTEST}/5MW_Land_BD_DLL_WTurb" if "--beamdyn" in sys.argv else f"{RTEST}/5MW_Land_DLL_WTurb" +BASE = f"{RTEST}/5MW_Baseline" +EXE = f"{REPO}/build-docker-double-debug/glue-codes/openfast/openfast" +WORK = os.path.join(os.environ.get("TMPDIR", "/tmp"), "of_mirror") + +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) +from compare_mirror import classify, blade_permutation # noqa: E402 + +RIGID = "--rigid" in sys.argv +# Free drivetrain: exercises the gearbox efficiency factor and shaft torque paths, +# which a fixed rotor speed never reaches. +GENDOF = "--gendof" in sys.argv +# Loose coupling is needed to reach SignLSSTrq, but BeamDyn is unstable with it, so it +# is requested separately rather than being implied by a free drivetrain. +LOOSE = "--loose" in sys.argv + +# Vertical shear is symmetric about the mirror plane, so both decks get the same +# exponent. Nacelle yaw is a global-frame orientation rather than a rotor-convention +# input, so the mirrored deck gets the opposite sign. +# BeamDyn blades instead of the ElastoDyn beam model. +BEAMDYN = "--beamdyn" in sys.argv +SHEAR = float(sys.argv[sys.argv.index("--shear") + 1]) if "--shear" in sys.argv else None +YAW = float(sys.argv[sys.argv.index("--yaw") + 1]) if "--yaw" in sys.argv else None +# Free yaw exercises the yaw bearing dynamics and the yaw moment mirror. +YAWDOF = "--yawdof" in sys.argv + +# With every structural DOF locked the BEMT iteration converges to slightly +# different round-off in the two runs; the real configurations hold 1e-6. +TOL = 1e-5 if RIGID else 1e-6 + +# One channel per line: the AeroDyn OutList parser only takes the first quoted +# name on each line and silently drops the rest. +AD_OUTLIST = """"RtAeroFxh" +"RtAeroMxh" +"RtTSR" +"RtSkew" +"B1N1Alpha" +"B1N2Alpha" +"B1N3Alpha" +"B1N1Theta" +"B1N2Theta" +"B1N3Theta" +"B1N1Phi" +"B1N2Phi" +"B1N3Phi" +"B1N1VDisx" +"B1N2VDisx" +"B1N3VDisx" +"B1N1VDisy" +"B1N2VDisy" +"B1N3VDisy" +"B1N1Fn" +"B1N2Fn" +"B1N3Fn" +"B1N1Ft" +"B1N2Ft" +"B1N3Ft" +"B1N1Cl" +"B1N2Cl" +"B1N3Cl" +"B1N1Curve" +"B1N2Curve" +"B1N3Curve" +""" + +OUTLIST = """"RotSpeed" - Rotor speed +"RotAccel" - Rotor acceleration +"Azimuth" - Blade 1 azimuth +"GenSpeed" - Generator speed +"LSShftFxa" - LSS thrust +"LSShftFya" +"LSShftFza" +"LSShftMxa" - LSS torque +"LSSTipVxa" +"LSSTipAxa" +"LSSTipPxa" +"LSShftTq" +"HSShftTq" +"HSShftPwr" +"HSSBrTq" +"LSSGagMxa" +"LSSGagPxa" +"GenAccel" +"LSSTipMya" +"LSSTipMza" +"RotPwr" - Rotor power +"RotThrust" - Rotor thrust +"RotTorq" - Rotor torque +"YawBrFxp" +"YawBrFyp" +"YawBrFzp" +"YawBrMxp" +"YawBrMyp" +"YawBrMzp" +"OoPDefl1" - Blade 1 out-of-plane tip deflection +"IPDefl1" - Blade 1 in-plane tip deflection +"TipDxc1" +"TipDyc1" +"TipDzc1" +"RootFxc1" +"RootFyc1" +"RootFzc1" +"RootMxc1" +"RootMyc1" +"RootMzc1" +"OoPDefl2" +"IPDefl2" +"RootMxc2" +"RootMyc2" +"OoPDefl3" +"IPDefl3" +"RootMxc3" +"RootMyc3" +"TwrBsFxt" +"TwrBsFyt" +"TwrBsMxt" +"TwrBsMyt" +"TwrBsMzt" +""" + + +def set_var(text, var, value): + pat = re.compile(r"^(\s*)(\S+)(\s+" + re.escape(var) + r"\s)", re.MULTILINE) + new, n = pat.subn(lambda m: f"{m.group(1)}{value}{m.group(3)}", text, count=1) + if n != 1: + raise KeyError(f"could not set {var!r}") + return new + + +def build(mirrored, tmax): + name = "mir" if mirrored else "cw" + # The baseline files are referenced as ../5MW_Baseline/..., so stage each case as a + # sibling of a symlink to the real one. + os.makedirs(WORK, exist_ok=True) + link = os.path.join(WORK, "5MW_Baseline") + if not os.path.exists(link): + os.symlink(BASE, link) + d = os.path.join(WORK, name) + shutil.rmtree(d, ignore_errors=True) + os.makedirs(d) + for f in os.listdir(SRC): + if f.endswith(".dat"): + shutil.copy(os.path.join(SRC, f), d) + + # ElastoDyn: fixed rotor speed (no controller), keep the flexible DOFs on so + # the structural side of the mirror is actually exercised. + ed_src = ("NRELOffshrBsline5MW_Onshore_ElastoDyn_BDoutputs.dat" if BEAMDYN + else "NRELOffshrBsline5MW_Onshore_ElastoDyn.dat") + ed = open(os.path.join(d, ed_src)).read() + ed = set_var(ed, "GenDOF", "True" if GENDOF else "False") + if GENDOF: + # The baseline gearbox is 100% efficient, which makes GBoxEffFac 1.0 whichever + # branch is taken and hides any error in the power-flow direction test. + ed = set_var(ed, "GBoxEff", "95.0") + ed = set_var(ed, "YawDOF", "True" if YAWDOF else "False") + ed = set_var(ed, "RotSpeed", "9.15") + if YAW is not None: + ed = set_var(ed, "NacYaw", str(-YAW if mirrored else YAW)) + ed = set_var(ed, "BlPitch(1)", "1.0") + ed = set_var(ed, "BlPitch(2)", "1.0") + ed = set_var(ed, "BlPitch(3)", "1.0") + if RIGID: + # Bisection aid: with every structural DOF off, only the geometry handed to + # AeroDyn can differ between the two runs. + for dof in ("FlapDOF1", "FlapDOF2", "EdgeDOF", "DrTrDOF", + "TwFADOF1", "TwFADOF2", "TwSSDOF1", "TwSSDOF2"): + ed = set_var(ed, dof, "False") + # Swap only the channel list, keeping the optional nodal-outputs section intact. + head, _, rest = ed.partition("OutList") + _, _, tail = rest.partition("END of OutList section") + ed = (head + "OutList - Output channels\n" + OUTLIST + + "END of OutList section" + tail) + open(os.path.join(d, "ElastoDyn.dat"), "w").write(ed) + + ad_name = "NRELOffshrBsline5MW_Onshore_AeroDyn.dat" + ad = open(os.path.join(d, ad_name)).read() + ad = set_var(ad, "NBlOuts", "3") + ad = set_var(ad, "SumPrint", "True") + head, _, rest = ad.partition("OutList ") + _, _, tail = rest.partition("END of OutList section") + ad = (head + "OutList - Output channels\n" + AD_OUTLIST + + "END of OutList section" + tail) + open(os.path.join(d, ad_name), "w").write(ad) + + fst_name = "5MW_Land_BD_DLL_WTurb.fst" if BEAMDYN else "5MW_Land_DLL_WTurb.fst" + fst = open(os.path.join(SRC, fst_name)).read() + fst = set_var(fst, "TMax", str(tmax)) + fst = set_var(fst, "CompServo", "0") + if LOOSE: + # SignLSSTrq, and so the gearbox efficiency direction, is only reached from + # the loose-coupling integrators. + fst = set_var(fst, "ModCoupling", "1") + fst = set_var(fst, "CompInflow", "1") + inflow = f"{BASE}/NRELOffshrBsline5MW_InflowWind_Steady8mps.dat" + if SHEAR is not None: + iw = open(inflow).read() + iw = set_var(iw, "PLExp", str(SHEAR)) + inflow = os.path.join(d, "InflowWind.dat") + open(inflow, "w").write(iw) + inflow = "InflowWind.dat" + fst = set_var(fst, "MirrorRotor", "True" if mirrored else "False") + fst = set_var(fst, "EDFile", '"ElastoDyn.dat"') + fst = set_var(fst, "InflowFile", + f'"{inflow}"') + fst = set_var(fst, "AeroFile", '"NRELOffshrBsline5MW_Onshore_AeroDyn.dat"') + fst = set_var(fst, "OutFileFmt", "1") + fst = set_var(fst, "Echo", "False") + open(os.path.join(d, f"{name}.fst"), "w").write(fst) + + p = subprocess.run([EXE, f"{name}.fst"], cwd=d, capture_output=True, text=True) + out = os.path.join(d, f"{name}.out") + if not os.path.exists(out): + tail = [l for l in (p.stdout + p.stderr).split("\n") if l.strip()][-8:] + print("\n".join(tail)) + sys.exit(f"{name} run failed") + return out + + +def load(path): + lines = open(path, errors="replace").read().split("\n") + h = next(i for i, l in enumerate(lines) if l.strip().startswith("Time")) + names = lines[h].split() + rows = [[float(x) for x in l.split()] for l in lines[h + 2:] if l.strip()] + return names, np.array(rows) + + +def main(): + tmax = 20 + if "--tmax" in sys.argv: + tmax = float(sys.argv[sys.argv.index("--tmax") + 1]) + shutil.rmtree(WORK, ignore_errors=True) + cw, mir = build(False, tmax), build(True, tmax) + n1, a = load(cw) + n2, b = load(mir) + idx = {k: v for v, k in enumerate(n1)} + sl = slice(int(0.5 * len(a)), None) + # Solver diagnostics are not physical and can be orders of magnitude larger than + # any load, which would drag the noise floor up and mask real channels. + DIAG = {"ConvError", "ConvIter", "NumUJac", "Time"} + phys = [idx[c] for c in n1 if c not in DIAG] + floor = 1e-9 * np.abs(a[sl][:, phys]).max() + + groups = {"S": [], "F": [], "A": [], "negligible": [], "?": []} + if "--dump" in sys.argv: + want = sys.argv[sys.argv.index("--dump") + 1].split(",") + rows = list(range(0, len(a), max(1, len(a) // 12))) + for ch in want: + print(f"\n{ch}:") + print(f"{'t':>8s} {'CW':>14s} {'MIRROR':>14s}") + for r in rows: + print(f"{a[r,0]:8.3f} {a[r,idx[ch]]:14.6g} {b[r,idx[ch]]:14.6g}") + return + + print(f"{'channel':14s} {'peak(CW)':>12s} {'class':>10s} {'resid':>10s}") + for ch in n1: + if ch == "Time": + continue + mate = blade_permutation(ch) + if mate not in idx: + mate = ch + got, rel = classify(a[sl, idx[ch]], b[sl, idx[mate]], TOL, floor) + if ch in DIAG: + got = "diagnostic" + groups.setdefault("diagnostic", []).append(ch) + continue + groups[got].append(ch) + print(f"{ch:14s} {np.abs(a[sl, idx[ch]]).max():12.5g} " + f"{got:>10s} {rel:10.2e}") + + print("\n--- measured summary (blade permutation applied) ---") + for k in ("S", "F", "A", "negligible", "?"): + if groups[k]: + print(f"{k:11s} ({len(groups[k]):2d}): {' '.join(groups[k])}") + if groups["?"]: + print(f"\n{len(groups['?'])} channel(s) neither same, flipped nor mirrored angle") + sys.exit(1) + print("\nEvery channel resolves to same, flipped, mirrored angle, or negligible") + + +if __name__ == "__main__": + main() diff --git a/reg_tests/otherTests/openfast_mirror_matrix.py b/reg_tests/otherTests/openfast_mirror_matrix.py new file mode 100644 index 0000000000..d7f3ef75d9 --- /dev/null +++ b/reg_tests/otherTests/openfast_mirror_matrix.py @@ -0,0 +1,54 @@ +#!/usr/bin/env python3 +"""Phase 1.5 acceptance: run the OpenFAST mirror check across the condition matrix. + +Each row exercises a different assumption in the sign map. A single condition +proves very little on its own; the point is that they all have to hold at once. + +Usage: openfast_mirror_matrix.py [name ...] +""" +import os +import subprocess +import sys + +HERE = os.path.dirname(os.path.abspath(__file__)) +RUNNER = os.path.join(HERE, "openfast_mirror.py") + +MATRIX = [ + ("rigid", ["--rigid"]), + ("base_flexible", []), + ("free_drivetrain", ["--gendof", "--loose"]), + ("shear", ["--shear", "0.2"]), + ("yaw_+15", ["--yaw", "15"]), + ("yaw_-15", ["--yaw", "-15"]), + ("shear_yaw", ["--shear", "0.2", "--yaw", "15"]), + ("free_yaw", ["--yawdof", "--yaw", "15"]), + ("shear_freeyaw_dt", ["--shear", "0.2", "--yaw", "10", "--yawdof", "--gendof", "--loose"]), + # BeamDyn blades. Not run with --loose: BeamDyn needs tight coupling. + ("bd_base", ["--beamdyn", "--tmax", "10"]), + ("bd_shear", ["--beamdyn", "--tmax", "10", "--shear", "0.2"]), + ("bd_yaw", ["--beamdyn", "--tmax", "10", "--yaw", "15"]), + ("bd_free_drivetrain", ["--beamdyn", "--tmax", "10", "--gendof"]), +] + + +def main(): + wanted = sys.argv[1:] + rows = [r for r in MATRIX if not wanted or r[0] in wanted] + fails = 0 + for name, args in rows: + p = subprocess.run([sys.executable, RUNNER] + args, + capture_output=True, text=True) + tail = [l for l in p.stdout.split("\n") if l.strip()] + verdict = tail[-1] if tail else "(no output)" + ok = p.returncode == 0 + fails += not ok + print(f" {name:20s} {'PASS' if ok else 'FAIL'} {verdict[:70]}", flush=True) + if not ok: + for l in tail[-6:]: + print(f" {l[:150]}") + print(f"\n{len(rows) - fails}/{len(rows)} conditions pass") + sys.exit(1 if fails else 0) + + +if __name__ == "__main__": + main() diff --git a/reg_tests/otherTests/openfast_regression.py b/reg_tests/otherTests/openfast_regression.py new file mode 100644 index 0000000000..13690a6cef --- /dev/null +++ b/reg_tests/otherTests/openfast_regression.py @@ -0,0 +1,97 @@ +#!/usr/bin/env python3 +"""Run OpenFAST regression cases and compare against their stored baselines. + +Runs each case in a scratch copy of the r-test tree so the committed reference +outputs are never overwritten. + +Usage: openfast_regression.py [ ...] +""" +import os +import shutil +import subprocess +import sys +import tempfile + +import numpy as np + +REPO_ROOT = os.environ.get("OPENFAST_REPO") or os.path.dirname( + os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) +REPO = REPO_ROOT +RTEST = f"{REPO}/reg_tests/r-test/glue-codes/openfast" +EXE = f"{REPO}/build-docker-double-debug/glue-codes/openfast/openfast" +sys.path.insert(0, f"{REPO}/reg_tests/lib") +import fast_io # noqa: E402 + +DETAIL = "--detail" in sys.argv + + +def read(path): + data, info, _ = fast_io.load_output(path) + return info["attribute_names"], np.asarray(data) + + +def run_case(case): + src = os.path.join(RTEST, case) + fst = [f for f in os.listdir(src) if f.endswith(".fst")] + if not fst: + return case, "SKIP", "no .fst" + fst = fst[0] + stem = fst[:-4] + ref = None + for cand in (f"{stem}.outb", f"{stem}.out"): + if os.path.exists(os.path.join(src, cand)): + ref = cand + break + if ref is None: + return case, "SKIP", "no reference output" + + with tempfile.TemporaryDirectory(dir=os.environ.get("TMPDIR")) as tmp: + for entry in os.listdir(RTEST): + if entry != case: + os.symlink(os.path.join(RTEST, entry), os.path.join(tmp, entry)) + work = os.path.join(tmp, case) + shutil.copytree(src, work) + + p = subprocess.run([EXE, fst], cwd=work, capture_output=True, text=True) + out = os.path.join(work, ref) + if not os.path.exists(out): + tail = [l for l in (p.stdout + p.stderr).split("\n") if l.strip()][-3:] + return case, "RUNFAIL", " | ".join(tail) + + rn, rd = read(os.path.join(src, ref)) + tn, td = read(out) + if rn != tn: + return case, "FAIL", "channel list changed" + if rd.shape != td.shape: + return case, "FAIL", f"shape {rd.shape} vs {td.shape}" + + scale = np.maximum(np.abs(rd).max(axis=0), 1e-12) + col = (np.abs(td - rd) / scale).max(axis=0) + rel = col.max() + if DETAIL and rel > 0.0: + order = np.argsort(col)[::-1] + print(f" {case}: {int((col > 0).sum())} of {len(col)} channels differ") + for k in order[:10]: + if col[k] > 0: + print(f" {tn[k]:16s} rel={col[k]:.3e}") + if rel == 0.0: + return case, "IDENTICAL", "rel=0" + if rel < 1e-10: + return case, "OK", f"rel={rel:.2e}" + return case, "FAIL", f"rel={rel:.2e} worst={tn[int(np.argmax(col))]}" + + +def main(): + args = [a for a in sys.argv[1:] if not a.startswith("--")] + fails = 0 + for case in args: + name, status, detail = run_case(case) + if status in ("FAIL", "RUNFAIL"): + fails += 1 + print(f" {name:34s} {status:10s} {detail}", flush=True) + print(f"\n{len(args) - fails}/{len(args)} cases match") + sys.exit(1 if fails else 0) + + +if __name__ == "__main__": + main() diff --git a/reg_tests/otherTests/rtest_regression.py b/reg_tests/otherTests/rtest_regression.py new file mode 100644 index 0000000000..f057d8675f --- /dev/null +++ b/reg_tests/otherTests/rtest_regression.py @@ -0,0 +1,106 @@ +#!/usr/bin/env python3 +"""Regression guard: MirrorRotor=F must reproduce the stored r-test baselines bit-for-bit. + +Copies each AeroDyn driver case to a scratch dir, runs the freshly built driver, +and compares every channel against the committed reference output. + +Usage: rtest_regression.py [ ...] +""" +import os +import shutil +import subprocess +import sys +import tempfile + +import numpy as np + +REPO_ROOT = os.environ.get("OPENFAST_REPO") or os.path.dirname( + os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) +REPO = REPO_ROOT +RTEST = f"{REPO}/reg_tests/r-test/modules/aerodyn" +DRIVER = f"{REPO}/build-docker-double-debug/modules/aerodyn/aerodyn_driver" +sys.path.insert(0, f"{REPO}/reg_tests/lib") +import fast_io # noqa: E402 + + +def read(path): + data, info, _ = fast_io.load_output(path) + return info["attribute_names"], np.asarray(data) + + +def run_case(case): + src = os.path.join(RTEST, case) + ref = None + for cand in ("ad_driver.outb", "ad_driver.out"): + if os.path.exists(os.path.join(src, cand)): + ref = cand + break + if ref is None: + return case, "SKIP", "no reference output" + + with tempfile.TemporaryDirectory(dir=os.environ.get("TMPDIR")) as tmp: + # Cases reference files by relative paths that escape the module folder + # (e.g. ../../../glue-codes/...), so rebuild the r-test layout in scratch. + rtest_root = os.path.abspath(os.path.join(RTEST, "..", "..")) + mod_dir = os.path.join(tmp, "modules", "aerodyn") + os.makedirs(mod_dir) + for entry in os.listdir(rtest_root): + if entry != "modules": + os.symlink(os.path.join(rtest_root, entry), + os.path.join(tmp, entry)) + for entry in os.listdir(os.path.join(rtest_root, "modules")): + if entry != "aerodyn": + os.symlink(os.path.join(rtest_root, "modules", entry), + os.path.join(tmp, "modules", entry)) + for entry in os.listdir(RTEST): + if entry != case: + os.symlink(os.path.join(RTEST, entry), + os.path.join(mod_dir, entry)) + + work = os.path.join(mod_dir, case) + shutil.copytree(src, work) + + dvr = next(f for f in os.listdir(work) if f.endswith(".dvr")) + proc = subprocess.run([DRIVER, dvr], cwd=work, + capture_output=True, text=True) + out = os.path.join(work, ref) + if proc.returncode != 0 or not os.path.exists(out): + tail = (proc.stdout + proc.stderr).strip().split("\n")[-3:] + return case, "RUNFAIL", " | ".join(tail) + + try: + rn, rd = read(os.path.join(src, ref)) + tn, td = read(out) + except Exception as exc: + return case, "READFAIL", str(exc) + + if rn != tn: + return case, "FAIL", "channel list changed" + if rd.shape != td.shape: + return case, "FAIL", f"shape {rd.shape} vs {td.shape}" + + diff = np.abs(td - rd) + scale = np.maximum(np.abs(rd).max(axis=0), 1e-12) + rel = (diff / scale).max() + if rel == 0.0: + return case, "IDENTICAL", "rel=0" + if rel < 1e-10: + return case, "OK", f"rel={rel:.2e}" + worst = tn[int(np.argmax((diff / scale).max(axis=0)))] + return case, "FAIL", f"rel={rel:.2e} worst={worst}" + + +def main(): + cases = sys.argv[1:] + fails = 0 + for case in cases: + name, status, detail = run_case(case) + if status in ("FAIL", "RUNFAIL", "READFAIL"): + fails += 1 + print(f" {name:32s} {status:10s} {detail}") + print(f"\n{len(cases) - fails}/{len(cases)} cases match the baseline") + sys.exit(1 if fails else 0) + + +if __name__ == "__main__": + main() diff --git a/reg_tests/otherTests/run_guards.sh b/reg_tests/otherTests/run_guards.sh new file mode 100755 index 0000000000..398950773e --- /dev/null +++ b/reg_tests/otherTests/run_guards.sh @@ -0,0 +1,60 @@ +#!/bin/bash +# Prove the MirrorRotor guard rails actually fire (and only fire when they should). +# Uses the DEBUG build: these runs abort during init, nothing is baselined. +set -u +HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +REPO="${OPENFAST_REPO:-$(cd "$HERE/../.." && pwd)}" +GC="${GUARDCHECK_DIR:-${TMPDIR:-/tmp}/openfast_guardcheck}" +mkdir -p "$GC" +RT=$REPO/reg_tests/r-test/glue-codes/openfast +OF=$REPO/build-docker-double-debug/glue-codes/openfast/openfast +SRC=$RT/5MW_Land_noDLL_Steady_MirrorRotor + +# $1 = variant name, $2 = MirrorRotor (True/False), $3 = Linearize (True/False), +# $4 = Wake_Mod (1/3), $5 = CompAA (True/False) +mkvariant () { + local name=$1 mirror=$2 lin=$3 wake=$4 aa=$5 + rm -rf "$GC/$name"; mkdir -p "$GC/$name" + cp "$SRC"/*.fst "$SRC"/AeroDyn.dat "$SRC"/ElastoDyn.dat "$SRC"/ElastoDyn_Tower.dat "$GC/$name/" + local fst="$GC/$name/5MW_Land_noDLL_Steady_MirrorRotor.fst" + sed -i -E "s#^([[:space:]]*)[A-Za-z]+([[:space:]]+MirrorRotor)#\1$mirror\2#" "$fst" + sed -i -E "s#^[A-Za-z]+([[:space:]]+Linearize)#$lin\1#" "$fst" + sed -i -E "s#^[0-9]+([[:space:]]+Wake_Mod)#$wake\1#" "$GC/$name/AeroDyn.dat" + sed -i -E "s#^[A-Za-z]+([[:space:]]+CompAA)#$aa\1#" "$GC/$name/AeroDyn.dat" + if [ "$wake" = "3" ]; then + cp "$RT/HelicalWake_OLAF"/*OLAF*.dat "$GC/$name/OLAF.dat" 2>/dev/null || \ + cp "$(find $RT/HelicalWake_OLAF -iname '*olaf*' -type f | head -1)" "$GC/$name/OLAF.dat" + sed -i -E "s#^\"[^\"]*\"([[:space:]]+OLAFInputFileName)#\"OLAF.dat\"\1#" "$GC/$name/AeroDyn.dat" + fi + # keep it short - we only care about init + sed -i -E "s#^([[:space:]]*)[0-9.]+([[:space:]]+TMax)#\1 0.5\2#" "$fst" +} + +# $3 = "yes" if the message is expected, "no" if it must be absent +run () { + local name=$1 expect=$2 want=$3 + cd "$GC/$name" || return + timeout 300 "$OF" 5MW_Land_noDLL_Steady_MirrorRotor.fst > run.log 2>&1 + local rc=$? + local got=no + grep -qi "$expect" run.log && got=yes + if [ "$got" = "$want" ]; then + echo "PASS $name (rc=$rc) guard fired=$got, expected=$want" + else + echo "FAIL $name (rc=$rc) guard fired=$got, expected=$want" + grep -i "FATAL\|Error" run.log | head -4 | sed 's/^/ /' + fi +} + +echo "=== guard rail proof, debug build ===" +mkvariant lin_mirror True True 1 False +mkvariant lin_cw False True 1 False +mkvariant olaf_mirror True False 3 False +mkvariant olaf_cw False False 3 False +mkvariant aa_mirror True False 1 True + +run lin_mirror "not yet supported with linearization" yes +run lin_cw "not yet supported with linearization" no +run olaf_mirror "not yet supported with the OLAF" yes +run olaf_cw "not yet supported with the OLAF" no +run aa_mirror "not yet supported with the AeroAcoustics" yes diff --git a/reg_tests/otherTests/sed_canary.py b/reg_tests/otherTests/sed_canary.py new file mode 100644 index 0000000000..53f91b911c --- /dev/null +++ b/reg_tests/otherTests/sed_canary.py @@ -0,0 +1,118 @@ +#!/usr/bin/env python3 +"""Phase 1.0b canary: the HSS brake must behave identically on a mirrored rotor. + +The brake is the one drivetrain load that is signed by the direction the shaft is +actually turning rather than by a convention, so it is the easiest place to get a +mirrored rotor wrong: a blanket sign flip makes the brake drive the rotor instead +of stopping it. This runs the SED HSS-brake case clockwise and mirrored and +requires the rotor-convention channels to be identical, not merely similar. + +Usage: sed_canary.py +""" +import os +import re +import shutil +import subprocess +import sys + +import numpy as np + +REPO_ROOT = os.environ.get("OPENFAST_REPO") or os.path.dirname( + os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) +REPO = REPO_ROOT +CASE = f"{REPO}/reg_tests/r-test/modules/simple-elastodyn/sed_test_HSSbrk" +DRIVER = f"{REPO}/build-docker-double-debug/modules/simple-elastodyn/sed_driver" +WORK = os.path.join(os.environ.get("TMPDIR", "/tmp"), "sed_canary") + +# RotSpeed and Azimuth are reported in the rotor's own convention, so a mirrored +# rotor spinning its design direction must read exactly the same as its CW twin. +IDENTICAL = ["Azimuth", "RotSpeed", "RotAcc", "GenSpeed", "GenAcc"] + +# The same two quantities carrying an explicit axis suffix are the physical components +# about the shaft x axis, so they must come out exactly opposite. Requesting them is the +# only way the split is visible at all -- the case ships with the rotor-convention names +# alone, and those read identically whether or not the split exists. +FLIPPED = ["LSSTipVxa", "LSSTipAxa"] + + +def load(path): + lines = open(path, errors="replace").read().split("\n") + h = next(i for i, l in enumerate(lines) if l.strip().startswith("Time")) + names = lines[h].split() + rows = [[float(x) for x in l.split()] for l in lines[h + 2:] if l.strip()] + return names, np.array(rows) + + +def build(mirrored): + name = "mir" if mirrored else "cw" + d = os.path.join(WORK, name) + shutil.rmtree(d, ignore_errors=True) + shutil.copytree(CASE, d) + + inp = os.path.join(d, "sed_primary.inp") + txt = open(inp).read() + txt = txt.replace('"RotTorq"\n', '"RotTorq"\n' + "".join(f'"{c}"\n' for c in FLIPPED)) + open(inp, "w").write(txt) + + dvr = os.path.join(d, "sed_driver.dvr") + txt = open(dvr).read() + txt = re.sub(r"^(\s*)\S+(\s+MirrorRotor\s)", + lambda m: f"{m.group(1)}{'True' if mirrored else 'False'}{m.group(2)}", + txt, count=1, flags=re.MULTILINE) + txt = re.sub(r'^("?)[^"\n]*\1(\s+OutRootName\s)', + lambda m: f'"{name}"{m.group(2)}', txt, count=1, flags=re.MULTILINE) + open(dvr, "w").write(txt) + p = subprocess.run([DRIVER, "sed_driver.dvr"], cwd=d, + capture_output=True, text=True) + out = os.path.join(d, f"{name}.out") + if not os.path.exists(out): + print((p.stdout + p.stderr)[-1500:]) + sys.exit(f"{name} run failed") + return out + + +def main(): + cw, mir = build(False), build(True) + n1, a = load(cw) + n2, b = load(mir) + idx = {k: v for v, k in enumerate(n1)} + + print(f"{'channel':10s} {'max|CW|':>12s} {'max abs diff':>14s} verdict") + bad = 0 + for ch in IDENTICAL: + if ch not in idx: + continue + x, y = a[:, idx[ch]], b[:, idx[ch]] + diff = np.abs(y - x).max() + ok = diff == 0.0 + bad += not ok + print(f"{ch:10s} {np.abs(x).max():12.5g} {diff:14.3e} " + f"{'IDENTICAL' if ok else 'DIFFERS'}") + + for ch in FLIPPED: + if ch not in idx: + print(f"{ch:10s} {'':>12s} {'':>14s} MISSING - split not exercised") + bad += 1 + continue + x, y = a[:, idx[ch]], b[:, idx[ch]] + diff = np.abs(y + x).max() + ok = diff == 0.0 and np.abs(x).max() > 0.0 + bad += not ok + print(f"{ch:10s} {np.abs(x).max():12.5g} {diff:14.3e} " + f"{'EXACTLY OPPOSITE' if ok else 'NOT OPPOSITE'}") + + # The brake must remove energy in both runs, whichever way the shaft turns. + sp = a[:, idx["RotSpeed"]] + spm = b[:, idx["RotSpeed"]] + print(f"\nCW RotSpeed {sp[0]:.4f} -> {sp[-1]:.4f} rpm") + print(f"MIR RotSpeed {spm[0]:.4f} -> {spm[-1]:.4f} rpm") + if abs(spm[-1]) > abs(spm[0]): + print("FAIL: mirrored rotor sped up - the brake is driving it") + bad += 1 + + print("\nCANARY PASS" if not bad else "\nCANARY FAIL") + sys.exit(1 if bad else 0) + + +if __name__ == "__main__": + main() diff --git a/reg_tests/otherTests/sweep_mirror.py b/reg_tests/otherTests/sweep_mirror.py new file mode 100644 index 0000000000..99ee694f6b --- /dev/null +++ b/reg_tests/otherTests/sweep_mirror.py @@ -0,0 +1,174 @@ +#!/usr/bin/env python3 +"""Phase 1.0a sweep: run the CW/mirrored driver pair across a matrix of conditions. + +Each variant edits the base driver deck and AeroDyn primary file, runs the pair, +and requires every channel to resolve to same / flipped / mirrored-angle / +negligible. A single condition proves very little on its own; the point of the +matrix is that each row exercises a different assumption in the sign map. + +Quantities defined in the global frame (nacelle yaw) are not rotor-convention +inputs, so the mirrored deck must be given the mirrored value explicitly. That is +what "mirror" entries do. Everything else stays identical between the pair, +which is the whole claim being tested. + +Usage: sweep_mirror.py [name ...] (no args runs the full matrix) +""" +import os +import re +import shutil +import subprocess +import sys + +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) +from compare_mirror import compare # noqa: E402 + +HERE = os.path.dirname(os.path.abspath(__file__)) +REPO_ROOT = os.environ.get("OPENFAST_REPO") or os.path.dirname( + os.path.dirname(HERE)) +BASE = os.path.join(os.path.dirname(HERE), "driver_checks") +DRIVER = os.path.join(REPO_ROOT, "build-docker-double-debug", + "modules", "aerodyn", "aerodyn_driver") +WORK = os.path.join(os.environ.get("TMPDIR", "/tmp"), "mirror_sweep") + +# name -> (dvr edits, primary edits, mirrored-deck overrides, blade permutation[, tol]) +# Tolerance defaults to 1e-6; raise it only where a stateful model makes exact +# agreement unreasonable, and say why. +MATRIX = [ + ("base", {}, {}, {}, False), + ("pitch_+10", {"BldPitch(1)": "10.0"}, {}, {}, False), + ("pitch_-3", {"BldPitch(1)": "-3.0"}, {}, {}, False), + ("wind_4", {"HWindSpeed": "4.0"}, {}, {}, False), + ("wind_20_stall", {"HWindSpeed": "20.0"}, {}, {}, False), + ("highTSR_25rpm", {"RotSpeed(1)": "25.0"}, {}, {}, False), + ("lowTSR_3rpm", {"RotSpeed(1)": "3.0"}, {}, {}, False), + ("propbrake", {"HWindSpeed": "25.0", "RotSpeed(1)": "3.0", + "BldPitch(1)": "-10.0"}, {}, {}, False), + # Shaft tilt skews the inflow, so the rotor sees azimuthal variation and the + # blades no longer pair up index for index. + ("tilt_5", {"ShftTilt(1)": "-5.0"}, {}, {}, True), + ("precone_2.5", {"Precone(1)": "2.5"}, {}, {}, False), + # Vertical shear is symmetric about the mirror plane, so the deck is shared; + # the blades still swap sweep order. + ("shear_0.2", {"PLExp": "0.2"}, {}, {}, True), + # Yaw is a global-frame orientation, so the mirrored run gets -yaw. + ("yaw_20", {"NacYaw(1)": "20.0"}, {}, {"NacYaw(1)": "-20.0"}, True), + ("yaw_20_skew", {"NacYaw(1)": "20.0"}, {"Skew_Mod": "1"}, + {"NacYaw(1)": "-20.0"}, True), + ("yaw_-20", {"NacYaw(1)": "-20.0"}, {}, {"NacYaw(1)": "20.0"}, True), + ("wake_off", {}, {"Wake_Mod": "0"}, {}, False), + ("bem_polar", {}, {"BEM_Mod": "2"}, {}, False), + # The polar BEM path measures skew with its own psiSkewOffset, built from a + # separate cross product, so it needs covering independently of BEM_Mod=1. + ("bem_polar_skew", {"NacYaw(1)": "20.0"}, {"BEM_Mod": "2", "Skew_Mod": "1"}, + {"NacYaw(1)": "-20.0"}, True), + ("bem_polar_shear", {"PLExp": "0.2"}, {"BEM_Mod": "2"}, {}, True), + ("dbemt_2", {}, {"DBEMT_Mod": "2"}, {}, False), + ("ua_3", {}, {"UA_Mod": "3"}, {}, False), + ("ua_6_oye", {}, {"UA_Mod": "6"}, {}, False), + ("ua_4_hgm", {}, {"UA_Mod": "4"}, {}, False), + # Shear + yaw + unsteady aero is the stiffest combination in the matrix. UA carries + # state and is solved iteratively, so the two runs converge to slightly different + # round-off; the residual here is ~1.5 N-m on a 9e5 N-m moment. + ("shear_yaw_ua", {"PLExp": "0.2", "NacYaw(1)": "15.0"}, + {"UA_Mod": "3", "Skew_Mod": "1"}, + {"NacYaw(1)": "-15.0"}, True, 1e-5), +] + + +def set_var(text, var, value): + """Replace the value column on the line whose comment names `var`.""" + pat = re.compile(r"^(\s*)(\S+)(\s+" + re.escape(var) + r"\s)", + re.MULTILINE) + new, n = pat.subn(lambda m: f"{m.group(1)}{value}{m.group(3)}", text, count=1) + if n != 1: + raise KeyError(f"could not set {var!r}") + return new + + +def build_case(dst, mirrored, dvr_edits, pri_edits, overrides): + os.makedirs(dst, exist_ok=True) + for f in os.listdir(BASE): + if f.endswith((".dat", ".dvr", ".csv", ".ipt")): + shutil.copy(os.path.join(BASE, f), dst) + + pri = open(os.path.join(BASE, "ad_primary.dat")).read() + for k, v in pri_edits.items(): + pri = set_var(pri, k, v) + open(os.path.join(dst, "ad_primary.dat"), "w").write(pri) + + dvr = open(os.path.join(BASE, "ad_CW.dvr")).read() + edits = dict(dvr_edits) + if mirrored: + edits.update(overrides) + for k, v in edits.items(): + dvr = set_var(dvr, k, v) + dvr = set_var(dvr, "MirrorRotor(1)", "True" if mirrored else "False") + name = "mir" if mirrored else "cw" + open(os.path.join(dst, f"{name}.dvr"), "w").write(dvr) + return os.path.join(dst, f"{name}.dvr") + + +def run(dvr_path): + d, f = os.path.split(dvr_path) + p = subprocess.run([DRIVER, f], cwd=d, capture_output=True, text=True) + out = os.path.join(d, f[:-4] + ".out") + if p.returncode != 0 or not os.path.exists(out): + tail = [l for l in (p.stdout + p.stderr).split("\n") if l.strip()][-2:] + return None, " | ".join(tail) + return out, "" + + +def main(): + wanted = sys.argv[1:] + rows = [r for r in MATRIX if not wanted or r[0] in wanted] + shutil.rmtree(WORK, ignore_errors=True) + + fails = 0 + print(f"{'variant':18s} {'chk':>4s} result") + for row in rows: + name, dvr_e, pri_e, over, permute = row[:5] + tol = row[5] if len(row) > 5 else 1e-6 + d = os.path.join(WORK, name) + try: + cw = build_case(d, False, dvr_e, pri_e, over) + mir = build_case(d, True, dvr_e, pri_e, over) + except KeyError as exc: + print(f"{name:18s} {'-':>4s} SETUP {exc}") + fails += 1 + continue + + cw_out, err = run(cw) + if cw_out is None: + print(f"{name:18s} {'-':>4s} CW RUN FAILED {err}") + fails += 1 + continue + mir_out, err = run(mir) + if mir_out is None: + print(f"{name:18s} {'-':>4s} MIRROR RUN FAILED {err}") + fails += 1 + continue + + checked, bad, unknown, _ = compare(cw_out, mir_out, tol=tol, + permute=permute) + tag = "perm" if permute else "" + if tol != 1e-6: + tag += f" tol={tol:g}" + if bad or unknown: + fails += 1 + print(f"{name:18s} {checked:4d} FAIL {tag}") + for ch, rel in unknown[:4]: + print(f"{'':18s} unclassified {ch} rel={rel:.2e}") + for ch, exp, got, rel in bad[:4]: + print(f"{'':18s} {ch} expected {exp} got {got} rel={rel:.2e}") + extra = len(bad) + len(unknown) - 8 + if extra > 0: + print(f"{'':18s} ... and {extra} more") + else: + print(f"{name:18s} {checked:4d} PASS {tag}") + + print(f"\n{len(rows) - fails}/{len(rows)} variants pass") + sys.exit(1 if fails else 0) + + +if __name__ == "__main__": + main() diff --git a/reg_tests/otherTests/v2_two_rotor.py b/reg_tests/otherTests/v2_two_rotor.py new file mode 100644 index 0000000000..6f9ee01bee --- /dev/null +++ b/reg_tests/otherTests/v2_two_rotor.py @@ -0,0 +1,91 @@ +"""V2: one clockwise rotor and one mirrored rotor inside a single driver run. + +Turbine 2 carries MirrorRotor, turbine 1 does not, and the two are otherwise the +same machine in the same uniform inflow. Their loads must therefore be exact +mirror images of each other, with no run-to-run difference of any kind to hide +behind: same solver, same time steps, same wind. + +Mirroring reverses the order in which the blades sweep, so blade 1 keeps its +place and blades 2 and 3 exchange. +""" +import os +import re +import sys + +import numpy as np + +REPO_ROOT = os.environ.get("OPENFAST_REPO") or os.path.dirname( + os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +sys.path.insert(0, os.path.join(REPO_ROOT, "reg_tests", "lib")) +import fast_io # noqa: E402 + +WORK = sys.argv[1] if len(sys.argv) > 1 else os.path.join( + os.environ.get("TMPDIR", "/tmp"), "v2test", "mir") +TOL = float(sys.argv[sys.argv.index("--tol") + 1]) if "--tol" in sys.argv else 1e-6 + +# Driver channels are ABN; the module form is BN... +AB = re.compile(r"^(A?B)(\d+)(N.*)$") + + +def swap(name, nblades=3): + m = AB.match(name) + if not m: + return name + k = int(m.group(2)) + if not 1 <= k <= nblades: + return name + return f"{m.group(1)}{1 if k == 1 else nblades - k + 2}{m.group(3)}" + + +def load(path): + d, info, _ = fast_io.load_output(path) + return info["attribute_names"], np.asarray(d) + + +def find(turbine): + for f in sorted(os.listdir(WORK)): + if f".T{turbine}." in f and f.endswith((".outb", ".out")): + return os.path.join(WORK, f) + sys.exit(f"no output file for turbine {turbine} in {WORK}") + + +n1, a = load(find(1)) +n2, b = load(find(2)) +if n1 != n2: + sys.exit("turbine 1 and turbine 2 report different channels") + +idx = {k: v for v, k in enumerate(n1)} +sl = slice(int(0.25 * len(a)), None) +phys = [idx[c] for c in n1 if c != "Time"] +floor = 1e-9 * np.abs(a[sl][:, phys]).max() + +groups = {} +for ch in n1: + if ch == "Time": + continue + mate = swap(ch) + if mate not in idx: + mate = ch + x, y = a[sl, idx[ch]], b[sl, idx[mate]] + peak = np.abs(x).max() + if peak < floor: + groups.setdefault("negligible", []).append((ch, 0.0)) + continue + rs = np.abs(y - x).max() / peak + rf = np.abs(y + x).max() / peak + if rs < TOL: + groups.setdefault("S", []).append((ch, rs)) + elif rf < TOL: + groups.setdefault("F", []).append((ch, rf)) + else: + groups.setdefault("?", []).append((ch, min(rs, rf))) + +for k, label in (("S", "same"), ("F", "flipped"), ("negligible", "negligible")): + if groups.get(k): + print(f"{label:11s} {len(groups[k]):4d}") +bad = groups.get("?", []) +print(f"unresolved {len(bad):4d}") +for c, r in sorted(bad, key=lambda t: -t[1])[:25]: + print(f" {c:16s} {r:.3e}") +sys.exit(1 if bad else 0) From 5f60a78b8f8ca91ca619656583377f8f81ba96e7 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Thu, 20 Aug 2026 17:51:01 -0600 Subject: [PATCH 45/66] Bring the mirrored-rotor documentation back in step with the code Three things had drifted. The restrictions table still listed SimplifiedElastoDyn and AeroDisk as unsupported, although both were enabled some commits ago and each has a registered case. The table of where the mirror is applied did not mention AeroDisk at all. The verification section said three comparisons were kept as regression cases, then listed five, while thirteen tests carry the mirrorrotor label. The measured sign table is regenerated. The caveat that the coefficient families were inferred rather than measured is gone, because they are now requested by a registered case and observed. Across the six pairs 1002 channels resolve: 677 identical, 324 sign-flipped and one mirrored angle, with 58 below the noise floor everywhere and 133 mooring channels set aside because their pairing depends on the layout. None is unresolved. Co-authored-by: Claude Opus 5 Co-authored-by: Claude Sonnet 4.5 --- docs/source/user/glue-code/mirror_rotor.rst | 82 ++++++++++++++++----- 1 file changed, 62 insertions(+), 20 deletions(-) diff --git a/docs/source/user/glue-code/mirror_rotor.rst b/docs/source/user/glue-code/mirror_rotor.rst index f57ba57684..183ff97e90 100644 --- a/docs/source/user/glue-code/mirror_rotor.rst +++ b/docs/source/user/glue-code/mirror_rotor.rst @@ -105,6 +105,13 @@ Where the mirror is applied * - SimplifiedElastoDyn - yes - The same pattern as ElastoDyn + * - AeroDisk + - yes + - The rotor speed and tip-speed ratio going into the coefficient table, + the skew-aligned disk triad, and the moment components coming out. The + triad is built so that all three basis vectors mirror as true vectors, + which makes the disk-frame force components invariant and every + disk-frame moment component change sign * - InflowWind - **no** - The flag mirrors the turbine, not the environment; a reflected @@ -234,7 +241,8 @@ registered mirrored case and comparing each channel against its clockwise counterpart, so it records behaviour that is actually observed rather than behaviour that is expected from reading the code. The cases contributing to it are the ElastoDyn + AeroDyn pair, the BeamDyn pair, the marine-turbine pair, the -two-rotor aerodynamic driver case and the twin-rotor semisubmersible. +yawed AeroDisk pair, the two-rotor aerodynamic driver case and the twin-rotor +semisubmersible. Note that mirroring reverses the order in which the blades sweep past a given point, so under non-axisymmetric inflow — shear, yaw, or shaft tilt — blade 2 of @@ -266,10 +274,15 @@ counter-clockwise rotor. ``RootFxb*``, ``RootFzb*``, ``RootMyb*``; the BeamDyn ``B*RootFxr``, ``B*RootFzr``, ``B*RootMyr``, ``B*TipTDxr``, ``B*TipTDzr``, ``B*TipRDyr``, ``B*FldFz`` families; - the AeroDyn ``*Alpha``, ``*Theta``, ``*Fn``, ``*Fl``, ``*Fd``, - ``*Vrel``, ``*Vindx``, ``*AxInd``, ``*TnInd``, ``*Gam``, ``*VUndx``, + the AeroDyn ``*Alpha``, ``*Theta``, ``*Phi``, ``*Fn``, ``*Fl``, + ``*Fd``, ``*Fx``, ``*Cl``, ``*Cd``, ``*Cx``, ``*Cn``, ``*Vrel``, + ``*Vindx``, ``*AxInd``, ``*TnInd``, ``*Gam``, ``*VUndx``, ``*VDisx`` families, in both the module (``B1N001Fn``) and nodal (``AB1N001Fn``) forms; + the per-blade ``B*AeroPwr``; + the AeroDisk ``ADFx``, ``ADFy``, ``ADFz``, ``ADFxi``, ``ADFzi``, + ``ADMyi``, ``ADCp``, ``ADCq``, ``ADCt``, ``ADPower``, ``ADSkew``, + ``ADTSR``, ``ADVRel`` channels; ``RtAeroFxh``, ``RtAeroFzh``, ``RtAeroMyh``, ``RtAeroPwr``, ``RtAeroCp``, ``RtAeroCt``, ``RtArea``, ``RtSkew``, ``RtTSR``, ``RtSpeed``, ``RtVAvgxh``, ``RtVAvgzh``, ``RtFldFxh``, ``RtFldFzg``, @@ -286,8 +299,10 @@ counter-clockwise rotor. ``RootFyb*``, ``RootMxb*``, ``RootMzb*``; the BeamDyn ``B*RootFyr``, ``B*RootMxr``, ``B*RootMzr``, ``B*TipTDyr``, ``B*TipRDxr``, ``B*TipRDzr``, ``B*FldMx`` families; - the AeroDyn ``*Ft``, ``*Vindy``, ``*STVy``, ``*Mm`` families, again in - both the module and nodal forms; + the AeroDyn ``*Ft``, ``*Fy``, ``*Cy``, ``*Cm``, ``*Ct``, ``*Vindy``, + ``*STVy``, ``*Mm`` families, again in both the module and nodal forms; + the AeroDisk ``ADMx``, ``ADMy``, ``ADMz``, ``ADFyi``, ``ADMxi``, + ``ADMzi``, ``ADSpeed`` channels; ``RtAeroFyh``, ``RtAeroMxh``, ``RtAeroMzh``, ``RtAeroCq``, ``RtVAvgyh``, ``RtFldFyh``, ``RtFldMxh``, ``RtFldMzh``; and for a marine turbine the buoyant ``*Fbt``, ``*Mbn``, ``*Mbs``, ``HbFby``, @@ -295,12 +310,17 @@ counter-clockwise rotor. * - Mirrored angle - ``LSSTipPxa``, ``LSSGagPxa`` -A few channels carry a sign change in the code but are not requested by any -registered mirrored case, so they do not appear above: the AeroDyn ``*Cy``, -``*Cm`` and ``*Ct`` coefficients, and the ``*Phi``, ``*Cl`` and ``*Cd`` families -that do not change. Their behaviour follows the same rule as the corresponding -force channels, but it is inferred rather than measured, and it should be -treated with more caution than the rest of the table. +Every channel that carries a mirror sign in the code is now requested by at +least one registered case, so no entry in this table is inferred from reading +the source. The coefficient families in particular are measured together with +their mirror-invariant partners — ``*Cy``, ``*Cm`` and ``*Ct`` alongside +``*Cl``, ``*Cd``, ``*Cx`` and ``*Cn`` — so that a sign applied to a whole group +by mistake cannot pass unnoticed. + +Across the six pairs, 1002 channels resolve: 677 identical, 324 sign-flipped and +one mirrored angle, with a further 58 below the noise floor in every case and +133 mooring channels set aside because their pairing is layout-specific. No +channel is unresolved. .. _glue-code-mirror-rotor-control: @@ -377,10 +397,8 @@ through. - ``Linearize = T`` * - Steady-state solver - ``CompAeroMaps = T`` - * - SimplifiedElastoDyn - - ``CompElast = 3`` - * - AeroDisk, ExtLoads - - ``CompAero = 1`` or ``3`` + * - ExtLoads + - ``CompAero = 3`` * - OLAF free vortex wake - ``Wake_Mod = 3`` in the AeroDyn input file * - AeroAcoustics @@ -405,8 +423,10 @@ module level the same comparison is run over blade pitch, wind speed, tip-speed ratio, the propeller-brake state, shaft tilt, precone, both BEM models, dynamic wake, and four unsteady-aerodynamic models. -Three of those comparisons are kept as regression cases, each paired with the -clockwise model it mirrors: +Some of those comparisons are kept as regression cases, each paired with the +clockwise model it mirrors — either a case that already existed, or a ``_CW`` +case registered alongside it. They all carry the ctest label ``mirrorrotor``, +so ``ctest -R mirrorrotor`` runs the set: .. list-table:: :header-rows: 1 @@ -415,16 +435,38 @@ clockwise model it mirrors: * - Case - What it covers * - ``5MW_Land_noDLL_Steady_MirrorRotor`` - - Steady wind, no controller, ElastoDyn blades + - Steady wind, no controller, ElastoDyn blades. The baseline pair, pinned + against ``5MW_Land_noDLL_Steady_CW`` * - ``5MW_Land_BD_noDLL_Steady_MirrorRotor`` - - The same with BeamDyn blades + - The same with BeamDyn blades, against ``5MW_Land_BD_noDLL_Steady_CW`` * - ``AWT_WSt_StartUp_HighSpShutDown_MirrorRotor`` - The high-speed-shaft brake taking the rotor down through zero speed, - which is the one torque signed by the direction of rotation + which is the one torque signed by the direction of rotation. Also a + two-bladed teetering rotor, which needs no blade swap * - ``5MW_Land_DLL_WTurb_MirrorRotor`` - Turbulence and a Bladed-style controller, ElastoDyn blades * - ``5MW_Land_BD_DLL_WTurb_MirrorRotor`` - The same with BeamDyn blades + * - ``5MW_OC4Semi_WSt_WavesWN_MirrorRotor`` + - A floating platform, exercising HydroDyn, SeaState and MoorDyn beneath a + mirrored rotor + * - ``5MW_Land_DLL_WTurb_ADsk_SED_MirrorRotor`` + - SimplifiedElastoDyn and AeroDisk in place of ElastoDyn and AeroDyn + * - ``5MW_MRSemi_DLL_WSt_WavesIrr_MirrorRotor`` + - A twin-rotor floating machine, with the whole stack solved together, so + one rotor is mirrored and the other is not + * - ``MHK_RM1_Floating_Steady_MirrorRotor`` + - A marine turbine, where the blade buoyancy and centre-of-buoyancy offset + are mirrored too. Paired with ``MHK_RM1_Floating_Steady_CW`` + * - ``ad_MultipleHAWT_MirrorRotor`` + - The AeroDyn driver rather than the glue code, covering the **nodal** + output path with two rotors in a single run + * - ``5MW_Land_ADsk_SED_Yaw_MirrorRotor`` + - A yawed AeroDisk rotor, paired with ``5MW_Land_ADsk_SED_Yaw_CW``. The + nacelle yaw is reversed between the two, since yaw acts about the + inertial vertical and is not mirrored. It uses a coefficient table with + the lateral coefficients filled in, because the shipped 5MW table has + them identically zero and so cannot reach the lateral sign factors at all The two turbulent cases are the ones that demonstrate the controller claim. The DISCON library is used completely unchanged, and blade pitch, generator torque, From cb3102c0bfb102dcc0a8419e1d9f9e440e5127d6 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Thu, 20 Aug 2026 17:53:33 -0600 Subject: [PATCH 46/66] Let the guard check set up its own case directory The deck it copies refers to ../5MW_Baseline for the inflow and airfoil data, and the script never created that link. Run from a fresh directory the cases aborted while reading their inputs, before reaching the guard. That failure mode is worth naming, because it is not symmetric. The mirrored variants reported the guard missing and failed loudly, but the clockwise controls check that the message is *absent*, and a run that never reaches the guard satisfies that trivially. Half the check was passing for the wrong reason and would have gone on doing so. Co-authored-by: Claude Opus 5 --- reg_tests/otherTests/run_guards.sh | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/reg_tests/otherTests/run_guards.sh b/reg_tests/otherTests/run_guards.sh index 398950773e..d418027ac7 100755 --- a/reg_tests/otherTests/run_guards.sh +++ b/reg_tests/otherTests/run_guards.sh @@ -10,6 +10,12 @@ RT=$REPO/reg_tests/r-test/glue-codes/openfast OF=$REPO/build-docker-double-debug/glue-codes/openfast/openfast SRC=$RT/5MW_Land_noDLL_Steady_MirrorRotor +# The deck refers to ../5MW_Baseline for the inflow and airfoil data. Without this +# the runs abort while reading their inputs, before reaching the guard at all - and a +# guard that is never reached looks exactly like a guard that stayed silent, so the +# clockwise controls would pass for the wrong reason. +ln -sfn "$RT/5MW_Baseline" "$GC/5MW_Baseline" + # $1 = variant name, $2 = MirrorRotor (True/False), $3 = Linearize (True/False), # $4 = Wake_Mod (1/3), $5 = CompAA (True/False) mkvariant () { From b2604ca0dfba7506e2932565d7243be85ab045c8 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Fri, 21 Aug 2026 08:36:17 -0600 Subject: [PATCH 47/66] Mirror the free wake OLAF is no longer refused for a mirrored rotor. The angle of attack was taken from geometry that had not been told the rotor turns the other way, so the section flew backwards: a case that gave 9.1 degrees clockwise gave 169.3 mirrored, and the two runs differed from the first time step. The rotation direction is carried **per wing**, not per simulation. OLAF holds the wings of every rotor in one shared wake and one Biot-Savart solve, so a farm may mix the two directions and both have to live in the same frame. Reflecting the world OLAF sees would have been simpler and would have broken exactly on the mixed cases this flag already supports. Carrying it per wing also leaves the wake in the physical frame, which keeps the wake visualisation, the ambient wind sampled along the filaments, and any circulation written to a checkpoint in the frame the user expects. Three things change for a mirrored wing. The angle of attack is taken in the clockwise-equivalent frame, so the airfoil tables stay verbatim as they are everywhere else in this feature. The bound circulation reverses, being a pseudovector along a span axis that is itself a true vector. And the lifting line's leading and trailing edges move to the other side of the reference point, because the section is used as the mirror image of the tabulated one; without that the bound vortex and the shed sheet sit on the wrong side of the chord and the wake is not the mirror image at all. That last one is worth the emphasis: it is the difference between agreeing to about seven per cent and agreeing exactly. The sign factor sits on the chordwise term in FVW_AeroOuts and on the normal term in Wings_ComputeCirculationPolarData. That looks inconsistent and both are required. The lifting-line panel normal is a cross product of two true vectors and so is a pseudovector, while the rows of a direction cosine matrix are not, so the two carry opposite signs under the reflection. Putting the factor on the matching term in both places was tried and measured, and is wrong. The loads leave the free-wake path in the same convention the blade-element path produces, so the two share their downstream treatment rather than diverging again. Measured on ad_B1n2_OLAF, a mirrored rotor now reproduces the clockwise one to 0.000e+00 relative difference over the whole time history. Nothing changes for a clockwise rotor, where every factor here is unity; all ten registered OLAF cases reproduce their baselines. Co-authored-by: Claude Opus 5 Co-authored-by: Claude Sonnet 5 Co-authored-by: Claude Haiku 4.5 --- modules/aerodyn/src/AeroDyn.f90 | 18 +++++++++++------- modules/aerodyn/src/FVW.f90 | 7 +++++-- modules/aerodyn/src/FVW_Registry.txt | 2 ++ modules/aerodyn/src/FVW_Subs.f90 | 18 +++++++++++++----- modules/aerodyn/src/FVW_Types.f90 | 8 ++++++++ modules/aerodyn/src/FVW_Wings.f90 | 28 ++++++++++++++++++++++++---- 6 files changed, 63 insertions(+), 18 deletions(-) diff --git a/modules/aerodyn/src/AeroDyn.f90 b/modules/aerodyn/src/AeroDyn.f90 index cb8a5e9a09..28d4e42012 100644 --- a/modules/aerodyn/src/AeroDyn.f90 +++ b/modules/aerodyn/src/AeroDyn.f90 @@ -436,10 +436,7 @@ subroutine AD_Init( InitInp, u, p, x, xd, z, OtherState, y, m, Interval, InitOut p%rotors(iR)%RotDir = 1.0_ReKi if (InitInp%rotors(iR)%MirrorRotor) then p%rotors(iR)%RotDir = -1.0_ReKi - ! Not yet worked through for the free wake or the acoustics model. - if (InputFileData%Wake_Mod == WakeMod_FVW) then - call SetErrStat(ErrID_Fatal, 'MirrorRotor is not yet supported with the OLAF free-vortex-wake model (Wake_Mod=3).', ErrStat, ErrMsg, RoutineName) - end if + ! Not yet worked through for the acoustics model. if (InputFileData%CompAA) then call SetErrStat(ErrID_Fatal, 'MirrorRotor is not yet supported with the AeroAcoustics model.', ErrStat, ErrMsg, RoutineName) end if @@ -4259,7 +4256,7 @@ subroutine SetOutputsFromFVW(t, u, p, OtherState, x, xd, m, y, ErrStat, ErrMsg) Vwnd = m%rotors(iR)%DisturbedInflow(1:3,j,k) ! NOTE: contains tower shadow theta = m%FVW%W(iW)%PitchAndTwist(j) ! TODO call FVW_AeroOuts( m%rotors(iR)%orientationAnnulus(1:3,1:3,j,k), u%rotors(iR)%BladeMotion(k)%Orientation(1:3,1:3,j), & ! inputs - theta, Vstr(1:3), Vind(1:3), VWnd(1:3), p%rotors(iR)%KinVisc, p%FVW%W(iW)%chord_LL(j), & ! inputs + theta, p%rotors(iR)%RotDir, Vstr(1:3), Vind(1:3), VWnd(1:3), p%rotors(iR)%KinVisc, p%FVW%W(iW)%chord_LL(j), & ! inputs AxInd, TanInd, Vrel, phi, alpha, Re, UrelWind_s(1:3), ErrStat2, ErrMsg2 ) ! outputs call SetErrStat(ErrStat2, ErrMsg2, ErrStat, ErrMsg, 'SetOutputsFromFVW') @@ -4299,9 +4296,13 @@ subroutine SetOutputsFromFVW(t, u, p, OtherState, x, xd, m, y, ErrStat, ErrMsg) Cy = Cl_dyn*sp - Cd_dyn*cp q = 0.5 * p%rotors(iR)%airDens * Vrel**2 ! dynamic pressure of the jth node in the kth blade + ! MirrorRotor: Cx, Cy and Cm_dyn are clockwise-frame coefficients, exactly as + ! BEMT returns them, so RotDir maps the tangential force and the pitching + ! moment back into the mirrored rotor frame before they are applied through + ! the physical annulus orientation. See SetOutputsFromBEMT. force(1) = Cx * q * p%FVW%W(iW)%chord_LL(j) ! X = normal force per unit length (normal to the plane, not chord) of the jth node in the kth blade - force(2) = -Cy * q * p%FVW%W(iW)%chord_LL(j) ! Y = tangential force per unit length (tangential to the plane, not chord) of the jth node in the kth blade - moment(3)= Cm_dyn * q * p%FVW%W(iW)%chord_LL(j)**2 ! M = pitching moment per unit length of the jth node in the kth blade + force(2) = -p%rotors(iR)%RotDir * Cy * q * p%FVW%W(iW)%chord_LL(j) ! Y = tangential force per unit length (tangential to the plane, not chord) of the jth node in the kth blade + moment(3)= p%rotors(iR)%RotDir * Cm_dyn * q * p%FVW%W(iW)%chord_LL(j)**2 ! M = pitching moment per unit length of the jth node in the kth blade ! save these values for possible output later: m%rotors(iR)%X(j,k) = force(1) @@ -5242,6 +5243,9 @@ SUBROUTINE Init_OLAF( InputFileData, u_AD, u, p, x, xd, z, OtherState, m, ErrSta do iB=1,p%rotors(iR)%numBlades iW=iW_incr+iB InitInp%W(iW)%iRotor = iR ! Indicate OLAF which wing belongs to which rotor + ! MirrorRotor: OLAF holds every rotor's wings in one shared wake, so the + ! rotation direction has to travel per wing rather than per simulation. + InitInp%W(iW)%RotDir = p%rotors(iR)%RotDir call AllocAry(InitInp%W(iW)%Chord, InitInp%numBladeNodes, 'chord', ErrStat2,ErrMsg2); if(Failed()) return call AllocAry(InitInp%W(iW)%AFindx,InitInp%numBladeNodes,1,'AFindx',ErrStat2,ErrMsg2); if(Failed()) return diff --git a/modules/aerodyn/src/FVW.f90 b/modules/aerodyn/src/FVW.f90 index 1eddc41460..81e13a3e7b 100644 --- a/modules/aerodyn/src/FVW.f90 +++ b/modules/aerodyn/src/FVW.f90 @@ -395,6 +395,7 @@ subroutine FVW_SetParametersFromInputs( InitInp, p, ErrStat, ErrMsg ) call AllocAry(p%W(iW)%AFindx, size(InitInp%W(iW)%AFindx,1), 1, 'AFindx',ErrStat,ErrMsg) p%W(iW)%AFindx = InitInp%W(iW)%AFindx ! Copying in case AD15 still needs these p%W(iW)%iRotor = InitInp%W(iW)%iRotor + p%W(iW)%RotDir = InitInp%W(iW)%RotDir p%W(iW)%nSpan = size(InitInp%W(iW)%chord)-1 call move_alloc(InitInp%W(iW)%chord, p%W(iW)%chord_LL) @@ -1750,11 +1751,13 @@ subroutine CalculateInputsAndOtherStatesForUA(InputIndex, u, p, x, xd, z, m, Err !! ....... compute inputs to UA ........... ! NOTE: To be consistent with CalcOutput we take Vwind_LL that was set using m%DisturbedInflow from AeroDyn.. ! This is not clean, but done to be consistent, waiting for AeroDyn to handle UA - call AlphaVrel_Generic(u%WingsMesh(iW)%Orientation(1:3,1:3,i), u%WingsMesh(iW)%TranslationVel(1:3,i), m%W(iW)%Vind_LL(1:3,i), u%W(iW)%Vwnd_LL(1:3,i), & + call AlphaVrel_Generic(u%WingsMesh(iW)%Orientation(1:3,1:3,i), p%W(iW)%RotDir, u%WingsMesh(iW)%TranslationVel(1:3,i), m%W(iW)%Vind_LL(1:3,i), u%W(iW)%Vwnd_LL(1:3,i), & p%KinVisc, p%W(iW)%chord_LL(i), u_UA%U, u_UA%alpha, u_UA%Re) u_UA%v_ac(1) = sin(u_UA%alpha)*u_UA%U u_UA%v_ac(2) = cos(u_UA%alpha)*u_UA%U - u_UA%omega = u%W(iW)%omega_z(i) + ! MirrorRotor: the torsion rate is the section-frame z component of a + ! pseudovector, which reverses under the reflection, matching BEMT's omega_z. + u_UA%omega = p%W(iW)%RotDir * u%W(iW)%omega_z(i) u_UA%UserProp = 0 ! u1%UserProp(i,j) ! TODO end do ! i nSpan end do ! iW nWings diff --git a/modules/aerodyn/src/FVW_Registry.txt b/modules/aerodyn/src/FVW_Registry.txt index 2d9ce90812..e565200621 100644 --- a/modules/aerodyn/src/FVW_Registry.txt +++ b/modules/aerodyn/src/FVW_Registry.txt @@ -86,6 +86,7 @@ typedef ^ ^ ReKi typedef ^ ^ ReKi s_LL : - - "Spanwise coordinate of LL elements" m typedef ^ ^ ReKi s_CP : - - "Spanwise coordinate of LL CP" m typedef ^ ^ IntKi iRotor - 0 - "Index of rotor the wing belong to" - +typedef ^ ^ ReKi RotDir - 1.0 - "Rotation direction of the rotor the wing belongs to: +1 clockwise, -1 mirrored (counter-clockwise viewed from upwind)" - typedef ^ ^ IntKi AFindx :: - - "Index to the airfoils from AD15 [BladeNode,BladeIndex=1]" - 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" @@ -292,6 +293,7 @@ typedef FVW/FVW Wng_InitInputType IntKi typedef ^ ^ ReKi chord : - - "Chord of each blade element from input file [idx1=BladeNode, idx2=Blade number]" - typedef ^ ^ ReKi RElm : - - "radius of center of each element" - typedef ^ ^ IntKi iRotor - - - "Index of rotor the wing belong to" - +typedef ^ ^ ReKi RotDir - 1.0 - "Rotation direction of the rotor the wing belongs to: +1 clockwise, -1 mirrored (counter-clockwise viewed from upwind)" - typedef ^ ^ INTEGER UAOff_innerNode - - - "Last node on each blade where UA should be turned off based on span location from blade root (0 if always on)" - typedef ^ ^ INTEGER UAOff_outerNode - - - "First node on each blade where UA should be turned off based on span location from blade tip (>nNodesPerBlade if always on)" - diff --git a/modules/aerodyn/src/FVW_Subs.f90 b/modules/aerodyn/src/FVW_Subs.f90 index 3c9061e537..fc4901d903 100644 --- a/modules/aerodyn/src/FVW_Subs.f90 +++ b/modules/aerodyn/src/FVW_Subs.f90 @@ -1699,11 +1699,12 @@ end subroutine FakeGroundEffect !! - some transformation matrices !! - M_ag : from global to airfoil (this is well defined, also called "n-t" system in AeroDyn) !! - M_sg : from global to section (this is ill-defined), this coordinate is used to define the "axial" and "tangential" inductions -subroutine FVW_AeroOuts( M_sg, M_ag, PitchAndTwist, Vstr_g, Vind_g, Vwnd_g, KinVisc, Chord, & +subroutine FVW_AeroOuts( M_sg, M_ag, PitchAndTwist, RotDir, Vstr_g, Vind_g, Vwnd_g, KinVisc, Chord, & AxInd, TanInd, Vrel_norm, phi, alpha, Re, Urel_s, ErrStat, ErrMsg ) real(R8Ki), intent(in ) :: M_sg(3,3) ! m%WithoutSweepPitchTwist global coord to "section" coord real(R8Ki), intent(in ) :: M_ag(3,3) ! u%BladeMotion(k)%Orientation(1:3,1:3,j) global coord to airfoil coord real(ReKi), intent(in ) :: PitchAndTwist ! Pitch and twist of section + real(ReKi), intent(in ) :: RotDir ! +1 clockwise rotor, -1 mirrored (counter-clockwise) real(ReKi), intent(in ) :: Vstr_g(3) ! Structural velocity global coord real(ReKi), intent(in ) :: Vind_g(3) ! Induced wind velocity global coord real(ReKi), intent(in ) :: Vwnd_g(3) ! Disturbed inflow global coord @@ -1739,14 +1740,19 @@ subroutine FVW_AeroOuts( M_sg, M_ag, PitchAndTwist, Vstr_g, Vind_g, Vwnd_g, Kin ! --- Airfoil coordinates: used to define alpha, and Vrel, also called "n-t" system Vtot_g = Vwnd_g - Vstr_g + Vind_g Vtot_a = matmul(M_ag, Vtot_g) + ! MirrorRotor: the airfoil tables describe the clockwise section, so the angles are + ! taken in the clockwise-equivalent frame. Reflecting about the rotor xz plane sends + ! a true vector's components in the airfoil and section frames to (v1, -v2, v3), so + ! RotDir applies to the chordwise and tangential components and to nothing else. + Vtot_a(2) = RotDir * Vtot_a(2) alpha = atan2( Vtot_a(1), Vtot_a(2) ) Vrel_norm = sqrt(Vtot_a(1)**2 + Vtot_a(2)**2) ! NOTE: z component shoudn't be used Re = Chord * Vrel_norm / KinVisc ! Reynolds number (not in million) ! Section coordinates: used to define axial induction andflow angle - Vstr_s = matmul(M_sg, Vstr_g) - Vind_s = matmul(M_sg, Vind_g) - Vwnd_s = matmul(M_sg, Vwnd_g) + Vstr_s = matmul(M_sg, Vstr_g); Vstr_s(2) = RotDir * Vstr_s(2) + Vind_s = matmul(M_sg, Vind_g); Vind_s(2) = RotDir * Vind_s(2) + Vwnd_s = matmul(M_sg, Vwnd_g); Vwnd_s(2) = RotDir * Vwnd_s(2) Urel_s = Vwnd_s - Vstr_s ! relative wind Vtot_s = Vwnd_s - Vstr_s + Vind_s if (EqualRealNos(Urel_s(1),0.0_ReKi)) then @@ -1765,8 +1771,9 @@ subroutine FVW_AeroOuts( M_sg, M_ag, PitchAndTwist, Vstr_g, Vind_g, Vwnd_g, Kin end subroutine FVW_AeroOuts !> Generic function to compute alpha, Vrel and Re based on global data -subroutine AlphaVrel_Generic(M_ag, Vstr_g, Vind_g, Vwnd_g, KinVisc, Chord, Vrel_norm, alpha, Re) +subroutine AlphaVrel_Generic(M_ag, RotDir, Vstr_g, Vind_g, Vwnd_g, KinVisc, Chord, Vrel_norm, alpha, Re) real(R8Ki), intent(in ) :: M_ag(3,3) ! u%BladeMotion(k)%Orientation(1:3,1:3,j) global coord to airfoil coord + real(ReKi), intent(in ) :: RotDir ! +1 clockwise rotor, -1 mirrored (counter-clockwise) real(ReKi), intent(in ) :: Vstr_g(3) ! Structural velocity global coord real(ReKi), intent(in ) :: Vind_g(3) ! Induced wind velocity global coord real(ReKi), intent(in ) :: Vwnd_g(3) ! Disturbed inflow global coord @@ -1781,6 +1788,7 @@ subroutine AlphaVrel_Generic(M_ag, Vstr_g, Vind_g, Vwnd_g, KinVisc, Chord, Vrel ! --- Airfoil coordinates: used to define alpha, and Vrel, also called "n-t" system Vtot_g = Vwnd_g - Vstr_g + Vind_g Vtot_a = matmul(M_ag, Vtot_g) + Vtot_a(2) = RotDir * Vtot_a(2) ! MirrorRotor: see FVW_AeroOuts alpha = atan2( Vtot_a(1), Vtot_a(2) ) Vrel_norm = sqrt(Vtot_a(1)**2 + Vtot_a(2)**2) ! NOTE: z component shoudn't be used Re = Chord * Vrel_norm / KinVisc ! Reynolds number NOTE: not in million diff --git a/modules/aerodyn/src/FVW_Types.f90 b/modules/aerodyn/src/FVW_Types.f90 index 9f0b0b1aa7..db9dbfbd7c 100644 --- a/modules/aerodyn/src/FVW_Types.f90 +++ b/modules/aerodyn/src/FVW_Types.f90 @@ -128,6 +128,7 @@ MODULE FVW_Types 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 !< Index of rotor the wing belong to [-] + REAL(ReKi) :: RotDir = 1.0 !< Rotation direction of the rotor the wing belongs to: +1 clockwise, -1 mirrored (counter-clockwise viewed from upwind) [-] INTEGER(IntKi) , DIMENSION(:,:), ALLOCATABLE :: AFindx !< Index to the airfoils from AD15 [BladeNode,BladeIndex=1] [-] 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] @@ -343,6 +344,7 @@ MODULE FVW_Types REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: chord !< Chord of each blade element from input file [idx1=BladeNode, idx2=Blade number] [-] REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: RElm !< radius of center of each element [-] INTEGER(IntKi) :: iRotor = 0_IntKi !< Index of rotor the wing belong to [-] + REAL(ReKi) :: RotDir = 1.0 !< Rotation direction of the rotor the wing belongs to: +1 clockwise, -1 mirrored (counter-clockwise viewed from upwind) [-] INTEGER(IntKi) :: UAOff_innerNode = 0_IntKi !< Last node on each blade where UA should be turned off based on span location from blade root (0 if always on) [-] INTEGER(IntKi) :: UAOff_outerNode = 0_IntKi !< First node on each blade where UA should be turned off based on span location from blade tip (>nNodesPerBlade if always on) [-] END TYPE Wng_InitInputType @@ -1392,6 +1394,7 @@ subroutine FVW_CopyWng_ParameterType(SrcWng_ParameterTypeData, DstWng_ParameterT DstWng_ParameterTypeData%s_CP = SrcWng_ParameterTypeData%s_CP end if DstWng_ParameterTypeData%iRotor = SrcWng_ParameterTypeData%iRotor + DstWng_ParameterTypeData%RotDir = SrcWng_ParameterTypeData%RotDir if (allocated(SrcWng_ParameterTypeData%AFindx)) then LB(1:2) = lbound(SrcWng_ParameterTypeData%AFindx) UB(1:2) = ubound(SrcWng_ParameterTypeData%AFindx) @@ -1456,6 +1459,7 @@ subroutine FVW_PackWng_ParameterType(RF, Indata) call RegPackAlloc(RF, InData%s_LL) call RegPackAlloc(RF, InData%s_CP) call RegPack(RF, InData%iRotor) + call RegPack(RF, InData%RotDir) call RegPackAlloc(RF, InData%AFindx) call RegPack(RF, InData%nSpan) call RegPackAlloc(RF, InData%PrescribedCirculation) @@ -1475,6 +1479,7 @@ subroutine FVW_UnPackWng_ParameterType(RF, OutData) call RegUnpackAlloc(RF, OutData%s_LL); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%s_CP); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%iRotor); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%RotDir); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%AFindx); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%nSpan); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%PrescribedCirculation); if (RegCheckErr(RF, RoutineName)) return @@ -3974,6 +3979,7 @@ subroutine FVW_CopyWng_InitInputType(SrcWng_InitInputTypeData, DstWng_InitInputT DstWng_InitInputTypeData%RElm = SrcWng_InitInputTypeData%RElm end if DstWng_InitInputTypeData%iRotor = SrcWng_InitInputTypeData%iRotor + DstWng_InitInputTypeData%RotDir = SrcWng_InitInputTypeData%RotDir DstWng_InitInputTypeData%UAOff_innerNode = SrcWng_InitInputTypeData%UAOff_innerNode DstWng_InitInputTypeData%UAOff_outerNode = SrcWng_InitInputTypeData%UAOff_outerNode end subroutine @@ -4005,6 +4011,7 @@ subroutine FVW_PackWng_InitInputType(RF, Indata) call RegPackAlloc(RF, InData%chord) call RegPackAlloc(RF, InData%RElm) call RegPack(RF, InData%iRotor) + call RegPack(RF, InData%RotDir) call RegPack(RF, InData%UAOff_innerNode) call RegPack(RF, InData%UAOff_outerNode) if (RegCheckErr(RF, RoutineName)) return @@ -4022,6 +4029,7 @@ subroutine FVW_UnPackWng_InitInputType(RF, OutData) call RegUnpackAlloc(RF, OutData%chord); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%RElm); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%iRotor); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%RotDir); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%UAOff_innerNode); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%UAOff_outerNode); if (RegCheckErr(RF, RoutineName)) return end subroutine diff --git a/modules/aerodyn/src/FVW_Wings.f90 b/modules/aerodyn/src/FVW_Wings.f90 index 4279d9d59c..89952b82ae 100644 --- a/modules/aerodyn/src/FVW_Wings.f90 +++ b/modules/aerodyn/src/FVW_Wings.f90 @@ -153,8 +153,13 @@ subroutine Wings_Panelling(Meshes, p, m, ErrStat, ErrMsg ) DP_LE(1) = -p%W(iW)%chord_LL(iSpan)/4. DP_TE(1:3) = 0.0 DP_TE(1) = +3.*p%W(iW)%chord_LL(iSpan)/4. - m%W(iW)%LE(1:3, iSpan) = P_ref + DP_LE(1)*Meshes(iW)%Orientation(2,1:3,iSpan) - m%W(iW)%TE(1:3, iSpan) = P_ref + DP_TE(1)*Meshes(iW)%Orientation(2,1:3,iSpan) + ! MirrorRotor: the section is used as the mirror image of the tabulated one, + ! so its leading and trailing edges lie on the other side of the reference + ! point. Without this the bound vortex and the shedding line sit on the wrong + ! side of the chord, and the wake is not the mirror image of the clockwise + ! one - an error of order chord over span. + m%W(iW)%LE(1:3, iSpan) = P_ref + p%W(iW)%RotDir*DP_LE(1)*Meshes(iW)%Orientation(2,1:3,iSpan) + m%W(iW)%TE(1:3, iSpan) = P_ref + p%W(iW)%RotDir*DP_TE(1)*Meshes(iW)%Orientation(2,1:3,iSpan) enddo enddo ! --- Generic code below to compute normal/tangential vectors of a lifting line panel @@ -564,7 +569,18 @@ subroutine CirculationFromPolarData(Gamma_LL, p, m, AFInfo, ErrStat, ErrMsg) Vjouk_orth_norm = TwoNorm(Vjouk_orth) Vrel_norm = TwoNorm(Vrel) - alpha = atan2(dot_product(Vrel,N) , dot_product(Vrel,Tc) ) ! [rad] + ! MirrorRotor: the airfoil tables describe the clockwise section, so the angle + ! of attack has to be taken in the clockwise-equivalent frame. Note that the + ! factor sits on the normal term here, not the tangential one as it does in + ! FVW_AeroOuts. Tang is a true vector but Norm is a cross product of two true + ! vectors, so it is a pseudovector and picks up the extra sign of the + ! reflection; the two routines describe the same angle through oppositely + ! signed quantities. + ! With the leading and trailing edges mirrored above, Tang reflects as a true + ! vector while Norm, being their cross product with the span, reflects as a + ! pseudovector and carries the extra sign. So RotDir sits on the normal term + ! here, unlike FVW_AeroOuts, which works from the airfoil DCM instead. + alpha = atan2(p%W(iW)%RotDir*dot_product(Vrel,N) , dot_product(Vrel,Tc) ) ! [rad] Re = p%W(iW)%chord_CP(icp) * Vrel_norm / p%KinVisc ! Reynolds number (not in Million) !if (p%CircSolvPolar==idPolarAeroDyn) then @@ -577,7 +593,11 @@ subroutine CirculationFromPolarData(Gamma_LL, p, m, AFInfo, ErrStat, ErrMsg) ! Simple method: ! Gamma_LL=(0.5 * Cl * Vrel_orth_norm*chord) ! VanGarrel's method: - Gamma_LL(kCP) =(0.5_ReKi * Cl * Vrel_orth_norm**2*m%W(iW)%Area(icp)/(Vjouk_orth_norm)) ! TODO + ! MirrorRotor: Cl above is the clockwise-equivalent value, so this is the + ! clockwise circulation. Bound circulation is a pseudovector along the span + ! while the span axis itself is a true vector, so the scalar strength + ! reverses on a mirrored wing. The wake stays in the physical frame. + Gamma_LL(kCP) = p%W(iW)%RotDir*(0.5_ReKi * Cl * Vrel_orth_norm**2*m%W(iW)%Area(icp)/(Vjouk_orth_norm)) ! TODO ! Convenient storage m%W(iW)%alpha_LL(icp) = alpha ! [rad] m%W(iW)%Vreln_LL(icp) = Vrel_norm From 5b3c8c48100568d5dda0c2159130148ca5acea16 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Fri, 21 Aug 2026 08:36:17 -0600 Subject: [PATCH 48/66] Report the free-wake blade outputs in the rotor's convention Each blade-node output family is written twice, once for the blade-element path and once for the free wake, and only the first carried the mirror sign. The Vindy, Cm, Cy, Ct, Fl, Fd, Fn and Ft families therefore came out of a mirrored free-wake rotor in the wrong convention, in both the module and the nodal form. Now that the free-wake quantities reach these blocks in the same clockwise-equivalent convention the blade-element ones use, the two branches carry the same factors in the same places, including the twist angle used to rotate the coefficients. Co-authored-by: Claude Opus 5 Co-authored-by: Claude Sonnet 5 Co-authored-by: Claude Haiku 4.5 --- .../aerodyn/src/AeroDyn_AllBldNdOuts_IO.f90 | 28 +++++++++---------- modules/aerodyn/src/AeroDyn_IO.f90 | 27 ++++++++++-------- 2 files changed, 30 insertions(+), 25 deletions(-) diff --git a/modules/aerodyn/src/AeroDyn_AllBldNdOuts_IO.f90 b/modules/aerodyn/src/AeroDyn_AllBldNdOuts_IO.f90 index 65e5dcd215..e9835cf38f 100644 --- a/modules/aerodyn/src/AeroDyn_AllBldNdOuts_IO.f90 +++ b/modules/aerodyn/src/AeroDyn_AllBldNdOuts_IO.f90 @@ -440,7 +440,7 @@ SUBROUTINE Calc_WriteAllBldNdOutput( p, p_AD, u, m, m_AD, x, y, OtherState, RotI DO iB=1,nB iW = W2B(iB) do iNdL=1,nNd; iNd=Nd(iNdL); - y%WriteOutput(iOut) = m_AD%FVW%W(iW)%BN_UrelWind_s(2,iNd) * m_AD%FVW%W(iW)%BN_TanInd(iNd) + y%WriteOutput(iOut) = p%RotDir * m_AD%FVW%W(iW)%BN_UrelWind_s(2,iNd) * m_AD%FVW%W(iW)%BN_TanInd(iNd) iOut = iOut + 1 END DO END DO @@ -739,7 +739,7 @@ SUBROUTINE Calc_WriteAllBldNdOutput( p, p_AD, u, m, m_AD, x, y, OtherState, RotI DO iB=1,nB iW = W2B(iB) do iNdL=1,nNd; iNd=Nd(iNdL); - y%WriteOutput(iOut) = m_AD%FVW%W(iW)%BN_Cm(iNd) + y%WriteOutput(iOut) = p%RotDir * m_AD%FVW%W(iW)%BN_Cm(iNd) iOut = iOut + 1 END DO END DO @@ -777,7 +777,7 @@ SUBROUTINE Calc_WriteAllBldNdOutput( p, p_AD, u, m, m_AD, x, y, OtherState, RotI DO iB=1,nB iW = W2B(iB) do iNdL=1,nNd; iNd=Nd(iNdL); - y%WriteOutput(iOut) = m_AD%FVW%W(iW)%BN_Cy(iNd) + y%WriteOutput(iOut) = p%RotDir * m_AD%FVW%W(iW)%BN_Cy(iNd) iOut = iOut + 1 END DO END DO @@ -820,9 +820,9 @@ SUBROUTINE Calc_WriteAllBldNdOutput( p, p_AD, u, m, m_AD, x, y, OtherState, RotI DO iB=1,nB iW = W2B(iB) do iNdL=1,nNd; iNd=Nd(iNdL); - ct=cos(m_AD%FVW%W(iW)%PitchAndTwist(iNd)) ! cos(theta) - st=sin(m_AD%FVW%W(iW)%PitchAndTwist(iNd)) ! sin(theta) - y%WriteOutput(iOut) = -m_AD%FVW%W(iW)%BN_Cx(iNd)*st + m_AD%FVW%W(iW)%BN_Cy(iNd)*ct + ct=cos(p%RotDir*m_AD%FVW%W(iW)%PitchAndTwist(iNd)) ! cos(theta) + st=sin(p%RotDir*m_AD%FVW%W(iW)%PitchAndTwist(iNd)) ! sin(theta) + y%WriteOutput(iOut) = p%RotDir * (-m_AD%FVW%W(iW)%BN_Cx(iNd)*st + m_AD%FVW%W(iW)%BN_Cy(iNd)*ct) iOut = iOut + 1 END DO END DO @@ -848,7 +848,7 @@ SUBROUTINE Calc_WriteAllBldNdOutput( p, p_AD, u, m, m_AD, x, y, OtherState, RotI do iNdL=1,nNd; iNd=Nd(iNdL); cp=cos(m_AD%FVW%W(iW)%BN_phi(iNd)) sp=sin(m_AD%FVW%W(iW)%BN_phi(iNd)) - y%WriteOutput(iOut) = m%X(iNd,iB)*cp - m%Y(iNd,iB)*sp + y%WriteOutput(iOut) = m%X(iNd,iB)*cp - p%RotDir*m%Y(iNd,iB)*sp iOut = iOut + 1 END DO END DO @@ -870,7 +870,7 @@ SUBROUTINE Calc_WriteAllBldNdOutput( p, p_AD, u, m, m_AD, x, y, OtherState, RotI do iNdL=1,nNd; iNd=Nd(iNdL); cp=cos(m_AD%FVW%W(iW)%BN_phi(iNd)) sp=sin(m_AD%FVW%W(iW)%BN_phi(iNd)) - y%WriteOutput(iOut) = m%X(iNd,iB)*sp + m%Y(iNd,iB)*cp + y%WriteOutput(iOut) = m%X(iNd,iB)*sp + p%RotDir*m%Y(iNd,iB)*cp iOut = iOut + 1 END DO END DO @@ -899,9 +899,9 @@ SUBROUTINE Calc_WriteAllBldNdOutput( p, p_AD, u, m, m_AD, x, y, OtherState, RotI DO iB=1,nB iW = W2B(iB) do iNdL=1,nNd; iNd=Nd(iNdL); - ct=cos(m_AD%FVW%W(iW)%PitchAndTwist(iNd)) ! cos(theta) - st=sin(m_AD%FVW%W(iW)%PitchAndTwist(iNd)) ! sin(theta) - y%WriteOutput(iOut) = m%X(iNd,iB)*ct - m%Y(iNd,iB)*st + ct=cos(p%RotDir*m_AD%FVW%W(iW)%PitchAndTwist(iNd)) ! cos(theta) + st=sin(p%RotDir*m_AD%FVW%W(iW)%PitchAndTwist(iNd)) ! sin(theta) + y%WriteOutput(iOut) = m%X(iNd,iB)*ct - p%RotDir*m%Y(iNd,iB)*st iOut = iOut + 1 END DO END DO @@ -922,9 +922,9 @@ SUBROUTINE Calc_WriteAllBldNdOutput( p, p_AD, u, m, m_AD, x, y, OtherState, RotI DO iB=1,nB iW = W2B(iB) do iNdL=1,nNd; iNd=Nd(iNdL); - ct=cos(m_AD%FVW%W(iW)%PitchAndTwist(iNd)) ! cos(theta) - st=sin(m_AD%FVW%W(iW)%PitchAndTwist(iNd)) ! sin(theta) - y%WriteOutput(iOut) = -m%X(iNd,iB)*st - m%Y(iNd,iB)*ct + ct=cos(p%RotDir*m_AD%FVW%W(iW)%PitchAndTwist(iNd)) ! cos(theta) + st=sin(p%RotDir*m_AD%FVW%W(iW)%PitchAndTwist(iNd)) ! sin(theta) + y%WriteOutput(iOut) = p%RotDir * (-m%X(iNd,iB)*st - p%RotDir*m%Y(iNd,iB)*ct) iOut = iOut + 1 END DO END DO diff --git a/modules/aerodyn/src/AeroDyn_IO.f90 b/modules/aerodyn/src/AeroDyn_IO.f90 index c7de4bc731..147d407f77 100644 --- a/modules/aerodyn/src/AeroDyn_IO.f90 +++ b/modules/aerodyn/src/AeroDyn_IO.f90 @@ -520,6 +520,7 @@ end subroutine Calc_WriteOutput_BEMT !! Make sure these are set! subroutine Calc_WriteOutput_FVW integer :: iW + real(ReKi) :: Xcw, Ycw ! blade-element loads converted back to the clockwise frame ! Induced velocity in global ! FVW already return this, we do a simple copy from Wings to Blades @@ -545,36 +546,40 @@ subroutine Calc_WriteOutput_FVW m%AllOuts( BNM( beta,k) ) = m_AD%FVW%W(iW)%BN_Vrel(j) / p%SpdSound m%AllOuts( BNVIndx(beta,k) ) = -m_AD%FVW%W(iW)%BN_UrelWind_s(1,j) * m_AD%FVW%W(iW)%BN_AxInd(j) - m%AllOuts( BNVIndy(beta,k) ) = m_AD%FVW%W(iW)%BN_UrelWind_s(2,j) * m_AD%FVW%W(iW)%BN_TanInd(j) + ! MirrorRotor: the FVW quantities below are clockwise-frame, as BEMT's are, + ! so this block now carries the same RotDir factors as its BEMT counterpart. + m%AllOuts( BNVIndy(beta,k) ) = p%RotDir * m_AD%FVW%W(iW)%BN_UrelWind_s(2,j) * m_AD%FVW%W(iW)%BN_TanInd(j) m%AllOuts( BNAxInd(beta,k) ) = m_AD%FVW%W(iW)%BN_AxInd(j) m%AllOuts( BNTnInd(beta,k) ) = m_AD%FVW%W(iW)%BN_TanInd(j) m%AllOuts( BNAlpha(beta,k) ) = m_AD%FVW%W(iW)%BN_alpha(j)*R2D - m%AllOuts( BNTheta(beta,k) ) = m_AD%FVW%W(iW)%PitchAndTwist(j)*R2D + m%AllOuts( BNTheta(beta,k) ) = p%RotDir * m_AD%FVW%W(iW)%PitchAndTwist(j)*R2D m%AllOuts( BNPhi( beta,k) ) = m_AD%FVW%W(iW)%BN_phi(j)*R2D m%AllOuts( BNCpmin(beta,k) ) = m_AD%FVW%W(iW)%BN_Cpmin(j) m%AllOuts( BNCl( beta,k) ) = m_AD%FVW%W(iW)%BN_Cl(j) m%AllOuts( BNCd( beta,k) ) = m_AD%FVW%W(iW)%BN_Cd(j) - m%AllOuts( BNCm( beta,k) ) = m_AD%FVW%W(iW)%BN_Cm(j) + m%AllOuts( BNCm( beta,k) ) = p%RotDir * m_AD%FVW%W(iW)%BN_Cm(j) m%AllOuts( BNCx( beta,k) ) = m_AD%FVW%W(iW)%BN_Cx(j) - m%AllOuts( BNCy( beta,k) ) = m_AD%FVW%W(iW)%BN_Cy(j) + m%AllOuts( BNCy( beta,k) ) = p%RotDir * m_AD%FVW%W(iW)%BN_Cy(j) - ct=cos(m_AD%FVW%W(iW)%PitchAndTwist(j)) ! cos(theta) - st=sin(m_AD%FVW%W(iW)%PitchAndTwist(j)) ! sin(theta) + ct=cos(p%RotDir*m_AD%FVW%W(iW)%PitchAndTwist(j)) ! cos(theta) + st=sin(p%RotDir*m_AD%FVW%W(iW)%PitchAndTwist(j)) ! sin(theta) m%AllOuts( BNCn( beta,k) ) = m_AD%FVW%W(iW)%BN_Cx(j)*ct + m_AD%FVW%W(iW)%BN_Cy(j)*st - m%AllOuts( BNCt( beta,k) ) =-m_AD%FVW%W(iW)%BN_Cx(j)*st + m_AD%FVW%W(iW)%BN_Cy(j)*ct + m%AllOuts( BNCt( beta,k) ) = p%RotDir*(-m_AD%FVW%W(iW)%BN_Cx(j)*st + m_AD%FVW%W(iW)%BN_Cy(j)*ct) cp=cos(m_AD%FVW%W(iW)%BN_phi(j)) sp=sin(m_AD%FVW%W(iW)%BN_phi(j)) - m%AllOuts( BNFl( beta,k) ) = m%X(j,k)*cp - m%Y(j,k)*sp - m%AllOuts( BNFd( beta,k) ) = m%X(j,k)*sp + m%Y(j,k)*cp + Xcw = m%X(j,k) + Ycw = p%RotDir * m%Y(j,k) + m%AllOuts( BNFl( beta,k) ) = Xcw*cp - Ycw*sp + m%AllOuts( BNFd( beta,k) ) = Xcw*sp + Ycw*cp m%AllOuts( BNMm( beta,k) ) = m%M(j,k) m%AllOuts( BNFx( beta,k) ) = m%X(j,k) m%AllOuts( BNFy( beta,k) ) = -m%Y(j,k) - m%AllOuts( BNFn( beta,k) ) = m%X(j,k)*ct - m%Y(j,k)*st - m%AllOuts( BNFt( beta,k) ) = -m%X(j,k)*st - m%Y(j,k)*ct + m%AllOuts( BNFn( beta,k) ) = Xcw*ct - Ycw*st + m%AllOuts( BNFt( beta,k) ) = p%RotDir*(-Xcw*st - Ycw*ct) m%AllOuts( BNGam( beta,k) ) = 0.5_ReKi * p_AD%FVW%W(iW)%chord_LL(j) * m_AD%FVW%W(iW)%BN_Vrel(j) * m_AD%FVW%W(iW)%BN_Cl(j) ! "Gam" [m^2/s] end do ! nodes From bf9098a2c1a414cbcc5eaa04f5b450520166e2b3 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Fri, 21 Aug 2026 08:36:30 -0600 Subject: [PATCH 49/66] Register the free-wake mirrored-rotor pair Both halves carry the mirrorrotor label. The r-test pointer also brings in the twin-rotor case's return to the free wake and its regenerated baseline. Co-authored-by: Claude Opus 5 Co-authored-by: Claude Sonnet 5 Co-authored-by: Claude Haiku 4.5 --- reg_tests/CTestList.cmake | 2 ++ reg_tests/r-test | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/reg_tests/CTestList.cmake b/reg_tests/CTestList.cmake index 975a7a4e6b..5040ea509b 100644 --- a/reg_tests/CTestList.cmake +++ b/reg_tests/CTestList.cmake @@ -477,6 +477,8 @@ 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_B1n2_OLAF_CW" "aerodyn;OLAF;mirrorrotor") +ad_regression("ad_B1n2_OLAF_MirrorRotor" "aerodyn;OLAF;mirrorrotor") 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") diff --git a/reg_tests/r-test b/reg_tests/r-test index c82eb8dddc..c608cfc762 160000 --- a/reg_tests/r-test +++ b/reg_tests/r-test @@ -1 +1 @@ -Subproject commit c82eb8dddcb8ffa88dbb4bbbf8184c9a54d0dfa9 +Subproject commit c608cfc76277bf706f610aa53530e468938bfd57 From eed021e5ebcc07a42a397356683bbb48f27cb0e7 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Fri, 21 Aug 2026 08:36:30 -0600 Subject: [PATCH 50/66] Measure the free wake in the sign table The pair is added to the set the table is generated from, and pairs may now name their output files directly, since the module-level driver cases do not follow the glue-code naming. Seven pairs now contribute. 1015 channels resolve: 686 identical, 328 sign-flipped and one mirrored angle, with 55 below the noise floor everywhere and 133 mooring channels set aside. None is unresolved. Co-authored-by: Claude Opus 5 Co-authored-by: Claude Sonnet 5 Co-authored-by: Claude Haiku 4.5 --- reg_tests/otherTests/emit_sign_table.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/reg_tests/otherTests/emit_sign_table.py b/reg_tests/otherTests/emit_sign_table.py index f4067c59be..0d8d244693 100644 --- a/reg_tests/otherTests/emit_sign_table.py +++ b/reg_tests/otherTests/emit_sign_table.py @@ -36,6 +36,9 @@ "MHK_RM1_Floating_Steady_MirrorRotor", 2), ("AeroDisk, yawed", "5MW_Land_ADsk_SED_Yaw_CW", "5MW_Land_ADsk_SED_Yaw_MirrorRotor", 3), + ("OLAF free wake", + f"{R}/modules/aerodyn/ad_B1n2_OLAF_CW/ad_driver.outb", + f"{R}/modules/aerodyn/ad_B1n2_OLAF_MirrorRotor/ad_driver.outb", 1), ] # label, single output file, per-rotor channel prefixes, blades @@ -102,7 +105,10 @@ def main(): origin = defaultdict(set) for label, cw, mir, nb_ in FILE_PAIRS: - pa, pb = f"{GC}/{cw}/{cw}.outb", f"{GC}/{mir}/{mir}.outb" + if cw.startswith("/") or "/" in cw: + pa, pb = cw, mir # explicit paths, for the module-level driver cases + else: + pa, pb = f"{GC}/{cw}/{cw}.outb", f"{GC}/{mir}/{mir}.outb" if not (os.path.exists(pa) and os.path.exists(pb)): print(f" skip {label}: missing baseline", file=sys.stderr) continue From 7c623229724a43189bc92f931a11a1a882e79e04 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Fri, 21 Aug 2026 08:36:30 -0600 Subject: [PATCH 51/66] Document the mirrored free wake OLAF leaves the list of restrictions and gains a section of its own, since the reasoning behind it is not obvious from the code: why the direction is carried per wing rather than by reflecting the world the wake solver sees, what the three changes are, and why the sign factor sits on a different term in the two places the angle of attack is formed. Co-authored-by: Claude Opus 5 Co-authored-by: Claude Sonnet 5 Co-authored-by: Claude Haiku 4.5 --- docs/source/user/glue-code/mirror_rotor.rst | 50 ++++++++++++++++++--- 1 file changed, 43 insertions(+), 7 deletions(-) diff --git a/docs/source/user/glue-code/mirror_rotor.rst b/docs/source/user/glue-code/mirror_rotor.rst index 183ff97e90..137346cba5 100644 --- a/docs/source/user/glue-code/mirror_rotor.rst +++ b/docs/source/user/glue-code/mirror_rotor.rst @@ -119,6 +119,11 @@ Where the mirror is applied * - BEMT, UnsteadyAero, DBEMT, AirfoilInfo - **no** - The physics kernels solve the equivalent clockwise problem + * - OLAF free vortex wake + - yes + - The circulation, the angle of attack and the lifting-line geometry, per + wing. The wake itself is left in the physical frame; see + :ref:`glue-code-mirror-rotor-olaf` * - AeroDyn driver - yes - Per-turbine flag; mirrors the prescribed hub kinematics and pitch @@ -153,6 +158,35 @@ Within AeroDyn: induction coefficients - Out +.. _glue-code-mirror-rotor-olaf: + +The free wake +------------- + +OLAF holds the wings of **every** rotor in one shared wake and one Biot-Savart +solve, so a mirrored rotor cannot be handled by reflecting the world the wake +solver sees: a farm may mix the two directions, and both must coexist in the +same frame. The rotation direction is therefore carried per wing, and the wake +stays in the physical frame. This keeps the wake visualisation, the ambient +wind sampled along the filaments, and any circulation written to a checkpoint in +the frame the user expects. + +Three things change for a mirrored wing. The angle of attack is taken in the +clockwise-equivalent frame, so the airfoil tables are used verbatim as they are +everywhere else. The bound circulation reverses, because it is a pseudovector +along a span axis that is itself a true vector. And the lifting line's leading +and trailing edges are placed on the other side of the reference point, because +the section is used as the mirror image of the tabulated one; without that the +bound vortex and the shed sheet sit on the wrong side of the chord and the wake +is not the mirror image, an error of order chord over span. + +One detail is worth stating because it looks wrong. The sign factor sits on the +**chordwise** term where the angle is taken from the airfoil direction cosine +matrix, and on the **normal** term where it is taken from the lifting-line panel. +Both describe the same angle. The panel normal is a cross product of two true +vectors and so is a pseudovector, while the rows of a direction cosine matrix +are not; the two carry opposite signs under the reflection. + .. _glue-code-mirror-rotor-beamdyn: BeamDyn blades @@ -241,8 +275,8 @@ registered mirrored case and comparing each channel against its clockwise counterpart, so it records behaviour that is actually observed rather than behaviour that is expected from reading the code. The cases contributing to it are the ElastoDyn + AeroDyn pair, the BeamDyn pair, the marine-turbine pair, the -yawed AeroDisk pair, the two-rotor aerodynamic driver case and the twin-rotor -semisubmersible. +yawed AeroDisk pair, the free-wake pair, the two-rotor aerodynamic driver case +and the twin-rotor semisubmersible. Note that mirroring reverses the order in which the blades sweep past a given point, so under non-axisymmetric inflow — shear, yaw, or shaft tilt — blade 2 of @@ -317,8 +351,8 @@ their mirror-invariant partners — ``*Cy``, ``*Cm`` and ``*Ct`` alongside ``*Cl``, ``*Cd``, ``*Cx`` and ``*Cn`` — so that a sign applied to a whole group by mistake cannot pass unnoticed. -Across the six pairs, 1002 channels resolve: 677 identical, 324 sign-flipped and -one mirrored angle, with a further 58 below the noise floor in every case and +Across the seven pairs, 1015 channels resolve: 686 identical, 328 sign-flipped +and one mirrored angle, with a further 55 below the noise floor in every case and 133 mooring channels set aside because their pairing is layout-specific. No channel is unresolved. @@ -399,8 +433,6 @@ through. - ``CompAeroMaps = T`` * - ExtLoads - ``CompAero = 3`` - * - OLAF free vortex wake - - ``Wake_Mod = 3`` in the AeroDyn input file * - AeroAcoustics - ``CompAA = True`` in the AeroDyn input file @@ -454,13 +486,17 @@ so ``ctest -R mirrorrotor`` runs the set: - SimplifiedElastoDyn and AeroDisk in place of ElastoDyn and AeroDyn * - ``5MW_MRSemi_DLL_WSt_WavesIrr_MirrorRotor`` - A twin-rotor floating machine, with the whole stack solved together, so - one rotor is mirrored and the other is not + one rotor is mirrored and the other is not. It runs OLAF, so the two + rotation directions also share a single wake * - ``MHK_RM1_Floating_Steady_MirrorRotor`` - A marine turbine, where the blade buoyancy and centre-of-buoyancy offset are mirrored too. Paired with ``MHK_RM1_Floating_Steady_CW`` * - ``ad_MultipleHAWT_MirrorRotor`` - The AeroDyn driver rather than the glue code, covering the **nodal** output path with two rotors in a single run + * - ``ad_B1n2_OLAF_MirrorRotor`` + - The free wake, paired with ``ad_B1n2_OLAF_CW``. A single blade of two + aerodynamic sections, which is the cheapest case that is still a rotor * - ``5MW_Land_ADsk_SED_Yaw_MirrorRotor`` - A yawed AeroDisk rotor, paired with ``5MW_Land_ADsk_SED_Yaw_CW``. The nacelle yaw is reversed between the two, since yaw acts about the From 3053a68511ed3041e61274828dd4cd8c8a6e1edb Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Tue, 25 Aug 2026 09:38:23 -0600 Subject: [PATCH 52/66] Stop the guard check asserting the free-wake restriction The OLAF restriction was lifted when the free wake was mirrored, but this script was left asserting that it still fires, so it had been failing ever since. The two OLAF variants now check that the message is absent in both directions. That is not redundant with the clockwise control: it means the check fails again if a refusal for OLAF is ever reintroduced, which is the useful thing to assert now that the combination is supported. Co-authored-by: Claude Opus 5 --- reg_tests/otherTests/run_guards.sh | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/reg_tests/otherTests/run_guards.sh b/reg_tests/otherTests/run_guards.sh index d418027ac7..95ec028cc2 100755 --- a/reg_tests/otherTests/run_guards.sh +++ b/reg_tests/otherTests/run_guards.sh @@ -61,6 +61,9 @@ mkvariant aa_mirror True False 1 True run lin_mirror "not yet supported with linearization" yes run lin_cw "not yet supported with linearization" no -run olaf_mirror "not yet supported with the OLAF" yes -run olaf_cw "not yet supported with the OLAF" no run aa_mirror "not yet supported with the AeroAcoustics" yes + +# The free wake is supported, so these two check that the restriction stays gone +# rather than that it fires. If someone reintroduces a refusal for OLAF, both fail. +run olaf_mirror "not yet supported with the OLAF" no +run olaf_cw "not yet supported with the OLAF" no From 3f3b96465710d3b4a11223ba53e8091a03df2e7c Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Tue, 25 Aug 2026 15:58:16 -0600 Subject: [PATCH 53/66] Render a mirrored VTK pair for visual inspection Every check in this work is numerical, and a tolerance cannot see a blade drawn on the wrong side, a rotor turning the right way with its geometry built the wrong way round, or a mesh that mirrors correctly in its own frame but is attached to the hub backwards. This draws the geometry so that a person can look at it, which HANDOFF section 11 has been asking for since the beginning. It reads the ASCII XML .vtp files directly rather than through the VTK module. Rendering through VTK needs an OpenGL context and this container has neither GLX, EGL nor OSMesa, so vtkRenderWindow cannot open at all; parsing the files and drawing with matplotlib sidesteps the question. Three figures are produced, and optionally the same three as H.264 video at the true VTK frame rate: the two cases side by side on identical axes, the mirrored geometry with y -> -y re-applied over the clockwise geometry, and the sense of rotation. Three measurement traps are encoded rather than left to be rediscovered, because each produced a convincing false positive while this was being written. The blade permutation is matched on the blade token and not on the end of the mesh name, since a name may continue "_Reference" or "Surface" afterwards and matching the end silently compares a blade against itself, which reports a clean 120 degree azimuth error. Shapes built by sweeping an angle have their vertex order reversed by the reflection, so the ground plane, tower, nacelle and hub are compared as point clouds; in vertex order two identical squares differ by 2*63 m. Reference meshes sit at the reference azimuth rather than the frame's, so they are measured but not drawn. Co-authored-by: Claude Opus 5 --- reg_tests/otherTests/render_vtk_pair.py | 916 ++++++++++++++++++++++++ 1 file changed, 916 insertions(+) create mode 100644 reg_tests/otherTests/render_vtk_pair.py diff --git a/reg_tests/otherTests/render_vtk_pair.py b/reg_tests/otherTests/render_vtk_pair.py new file mode 100644 index 0000000000..17729b5a77 --- /dev/null +++ b/reg_tests/otherTests/render_vtk_pair.py @@ -0,0 +1,916 @@ +#!/usr/bin/env python3 +"""Render an OpenFAST VTK mesh pair for visual inspection of the mirror. + +Every other check in the MirrorRotor work is numerical, and a tolerance cannot +see a blade drawn on the wrong side, a rotor turning the right way with its +geometry built the wrong way round, or a mesh that mirrors correctly in its own +frame but is attached to the hub backwards. This renders the geometry so that a +human can look at it. + +The container this was written in has no OpenGL -- GLX, EGL and OSMesa are all +absent, so VTK cannot open a render window -- and the VTK python module is +therefore not used at all. The ``.vtp`` files OpenFAST writes are ASCII XML +PolyData, so they are parsed directly and drawn with matplotlib. + +Three figures are produced for a pair of case directories: + +``geometry.png`` + The clockwise and mirrored geometry side by side at one instant, in three + views, on identical axes. Look at these first, and independently: they are + the only output that can show an error the mirror operator itself shares. + +``overlay.png`` + The mirrored geometry with ``y -> -y`` re-applied, drawn over the clockwise + geometry. Where the implementation is right the two coincide. This is much + the easier judgement to make, but it is a numerical test wearing a visual + costume, so it does not replace ``geometry.png``. + +``rotation.png`` + Blade tip paths over the run, viewed looking downwind, coloured by time. + This is what shows the sense of rotation. + +Usage:: + + python3 render_vtk_pair.py --cw --mirror --out

+ +Each case directory is the one holding the ``vtk/`` subdirectory that OpenFAST +wrote. ``--frame`` picks the instant for the first two figures. +""" + +from __future__ import annotations + +import argparse +import os +import re +import shutil +import subprocess +import sys +import xml.etree.ElementTree as ET +from collections import defaultdict + +import numpy as np + +import matplotlib +matplotlib.use("Agg") +import matplotlib.pyplot as plt +from matplotlib.collections import LineCollection, PolyCollection +from mpl_toolkits.mplot3d.art3d import Line3DCollection, Poly3DCollection + + +# The mirror operator. See docs/source/user/glue-code/mirror_rotor.rst. +S = np.diag([1.0, -1.0, 1.0]) + + +# --------------------------------------------------------------------------- +# reading + + +def _array(el): + """Text of a DataArray as a flat float array.""" + return np.fromstring(el.text.replace("\n", " "), sep=" ") + + +def _cells(piece, tag): + """(connectivity, offsets) for a Lines or Polys block, or None.""" + block = piece.find(tag) + if block is None: + return None + named = {da.get("Name"): da for da in block.findall("DataArray")} + if "connectivity" not in named or "offsets" not in named: + return None + conn = _array(named["connectivity"]).astype(int) + offs = _array(named["offsets"]).astype(int) + if conn.size == 0: + return None + return conn, offs + + +def _split(conn, offs): + """Split a connectivity array at its offsets into per-cell index arrays.""" + return [conn[a:b] for a, b in zip(np.concatenate(([0], offs[:-1])), offs)] + + +def read_vtp(path): + """Parse one OpenFAST .vtp file. + + Returns a dict with ``points`` (n,3), ``lines`` and ``polys`` (lists of + index arrays) and ``fields`` (name -> (n,3) array) for whatever point data + the file carries. OpenFAST writes orientation and, with VTK_fields, motion + and load fields; all are read the same way. + """ + piece = ET.parse(path).getroot().find(".//Piece") + if piece is None: + raise ValueError(f"{path}: no Piece element") + + pts_el = piece.find("Points/DataArray") + points = _array(pts_el).reshape(-1, 3) + + fields = {} + pd = piece.find("PointData") + if pd is not None: + for da in pd.findall("DataArray"): + name = da.get("Name") + ncomp = int(da.get("NumberOfComponents", "1")) + if name: + fields[name] = _array(da).reshape(-1, ncomp) + + lines = _cells(piece, "Lines") + polys = _cells(piece, "Polys") + return { + "points": points, + "lines": _split(*lines) if lines else [], + "polys": _split(*polys) if polys else [], + "fields": fields, + } + + +# VTK_tWidth scales with the run length, so the frame field is not always four +# digits; a greedy root takes the last dotted number group, which is the frame. +_FRAME_RE = re.compile(r"^(?P.+)\.(?P\d+)\.vtp$") + + +def scan(case_dir): + """Index a case's vtk directory. + + Returns (meshes, frames) where meshes maps a mesh name -- the file root with + the case prefix stripped -- to {frame_number: path}, and frames is the + sorted list of frames present in every mesh. Reference and static files are + indexed under frame None. + """ + vtk_dir = os.path.join(case_dir, "vtk") + if not os.path.isdir(vtk_dir): + raise SystemExit(f"no vtk/ directory in {case_dir}") + + meshes = defaultdict(dict) + for fn in sorted(os.listdir(vtk_dir)): + if not fn.endswith(".vtp"): + continue + path = os.path.join(vtk_dir, fn) + m = _FRAME_RE.match(fn) + if m: + meshes[m.group("root")][int(m.group("frame"))] = path + else: + meshes[fn[: -len(".vtp")]][None] = path + + # Strip the leading case name, which differs between the two members of a + # pair and would otherwise stop the meshes from lining up. + prefix = os.path.basename(os.path.normpath(case_dir)) + "." + stripped = {} + for name, byframe in meshes.items(): + stripped[name[len(prefix):] if name.startswith(prefix) else name] = byframe + + animated = [f for m in stripped.values() for f in m if f is not None] + frames = sorted(set(animated)) + return stripped, frames + + +# --------------------------------------------------------------------------- +# what each mesh is, and how to draw it + + +def vtk_dt(case_dir): + """Seconds between VTK frames, from the case summary file. + + OpenFAST rounds 1/VTK_fps to an integer multiple of DT, so the frame + spacing is generally not 1/VTK_fps and cannot be taken from the deck. The + summary reports the effective rate directly. Note that the time-step table + just above it truncates the exponent off every row that carries a subcycle + count -- see FAST_Subs.f90, the T37 in the format string -- so the rate line + is the one to read, not the table. + """ + for fn in sorted(os.listdir(case_dir)): + if not fn.endswith(".sum"): + continue + with open(os.path.join(case_dir, fn), errors="ignore") as fh: + for line in fh: + if "Frame rate" in line: + m = re.search(r"([0-9]+\.[0-9]+)\s*fps", line) + if m and float(m.group(1)) > 0: + return 1.0 / float(m.group(1)) + return None + + +def when(dt, frame): + """Label for a frame: its time if we know the rate, else the index.""" + if dt is None: + return f"frame {frame}" + return f"t = {dt * frame:.2f} s (frame {frame})" + + +def style(name): + """Colour, line width and z-order for a mesh, by family.""" + if "GroundSurface" in name: + return "0.80", 0.8, 0 + # VTK_type = 1 writes surfaces rather than the debug line meshes. + if "BladeSurface" in name or ("Blade" in name and name.endswith("Surface")): + return "#1f77b4", 0.4, 3 + if "TowerSurface" in name: + return "0.35", 0.4, 1 + if "NacelleSurface" in name or "HubSurface" in name: + return "#ff7f0e", 0.4, 5 + if name.startswith("BD_Blade"): + return "#1f77b4", 2.2, 3 # the structural blade + if name.startswith("AD_Blade_"): + return "#d62728", 1.4, 2 # the aerodynamic blade + if "BladeRootMotion" in name: + return "#2ca02c", 3.0, 4 + if "ReactionForce" in name: + return "#9467bd", 3.0, 4 + if "HubMotion" in name: + return "#ff7f0e", 3.0, 5 + if "Tower" in name: + return "0.35", 2.0, 1 + return "0.5", 1.0, 1 + + +def collect(meshes, frame, want=None): + """Read every mesh at a frame. Falls back to the static file if a mesh has + no animated frames, so the ground plane and any reference-only mesh still + appear.""" + out = {} + for name, byframe in sorted(meshes.items()): + if want is not None and not want(name): + continue + path = byframe.get(frame) + if path is None: + path = byframe.get(None) + if path is None: + continue + out[name] = read_vtp(path) + return out + + +def draw(ax, data, transform=None, colour=None, alpha=1.0, points=True): + """Draw a set of meshes into a 3-D axis. + + ``transform`` is applied to every point, which is how the overlay re-applies + the mirror. ``colour`` overrides the per-family colour, which is how the + overlay tells the two turbines apart. + """ + for name, mesh in data.items(): + p = mesh["points"] + if transform is not None: + p = p @ transform.T + base, lw, zo = style(name) + c = colour or base + + segs = [p[idx] for idx in mesh["lines"] if len(idx) >= 2] + if segs: + ax.add_collection3d( + Line3DCollection(segs, colors=c, linewidths=lw, alpha=alpha, zorder=zo) + ) + faces = [p[idx] for idx in mesh["polys"] if len(idx) >= 3] + if faces: + ax.add_collection3d( + Poly3DCollection( + faces, facecolors=c, edgecolors="none", alpha=alpha * 0.35, zorder=zo + ) + ) + # A mesh with no cells is a single node -- the hub, a blade root -- and + # is invisible unless its points are drawn. + if points and not segs and not faces: + ax.scatter(p[:, 0], p[:, 1], p[:, 2], c=c, s=28, alpha=alpha, zorder=zo, + depthshade=False) + + +def draw2d(ax, data, axes, transform=None, colour=None, alpha=1.0): + """Draw a set of meshes as a flat orthographic projection. + + ``axes`` picks the two coordinate indices to plot. True coordinates are + plotted and the axis is reversed by ``setup2d`` where a view needs it, so + that the tick labels keep meaning what they say; negating the data instead + puts a node at y = +63 under a tick reading -60. + + These views are planar, so drawing them in a 3-D axis only buys + matplotlib's pane and tick furniture over the top of the geometry. + """ + i, j = axes + si = sj = 1 + for name, mesh in data.items(): + p = mesh["points"] + if transform is not None: + p = p @ transform.T + base, lw, zo = style(name) + c = colour or base + u, v = si * p[:, i], sj * p[:, j] + + segs = [np.column_stack((u[idx], v[idx])) for idx in mesh["lines"] if len(idx) >= 2] + if segs: + ax.add_collection( + LineCollection(segs, colors=c, linewidths=lw, alpha=alpha, zorder=zo) + ) + faces = [np.column_stack((u[idx], v[idx])) for idx in mesh["polys"] if len(idx) >= 3] + if faces: + ax.add_collection( + PolyCollection(faces, facecolors=c, edgecolors="none", + alpha=alpha * 0.25, zorder=zo) + ) + if not segs and not faces: + ax.scatter(u, v, c=c, s=30, alpha=alpha, zorder=zo) + + +# Two planar views plus one isometric. (label, axis indices, which axes to +# reverse, axis labels). Looking downwind means +x into the page; the frame is +# right-handed with z up, so +y runs to the left and the horizontal axis of +# that view is reversed. +FLAT_VIEWS = [ + ("looking downwind, +x into page", (1, 2), (True, False), + "y (m), increasing to the left", "z (m)"), + ("plan, from above", (0, 1), (False, False), "x (m), downwind", "y (m)"), +] + + +def frame_limits(*datasets): + """A single cubic bounding box covering everything, so that the two members + of a pair are drawn to exactly the same scale and cannot be compared + misleadingly.""" + pts = [] + for data in datasets: + for mesh in data.values(): + pts.append(mesh["points"]) + allp = np.vstack(pts) + # The ground plane is huge and would shrink the turbine to nothing. + turbine = allp[allp[:, 2] > 1.0] + if len(turbine) > 8: + allp = turbine + lo, hi = allp.min(axis=0), allp.max(axis=0) + ctr = 0.5 * (lo + hi) + half = 0.55 * (hi - lo).max() + return np.array([ctr - half, ctr + half]) + + +def setup(ax, lim, title, elev=22, azim=-125): + ax.set_xlim(lim[0, 0], lim[1, 0]) + ax.set_ylim(lim[0, 1], lim[1, 1]) + ax.set_zlim(lim[0, 2], lim[1, 2]) + ax.set_box_aspect((1, 1, 1)) + ax.view_init(elev=elev, azim=azim) + ax.set_xlabel("x", fontsize=7) + ax.set_ylabel("y", fontsize=7) + ax.set_zlabel("z", fontsize=7) + ax.set_title(title, fontsize=9) + ax.tick_params(labelsize=5) + + +def setup2d(ax, lim, view, title): + _, (i, j), (rx, ry), xl, yl = view + ax.set_xlim(lim[0, i], lim[1, i]) + ax.set_ylim(lim[0, j], lim[1, j]) + if rx: + ax.invert_xaxis() + if ry: + ax.invert_yaxis() + ax.set_aspect("equal") + ax.set_xlabel(xl, fontsize=8) + ax.set_ylabel(yl, fontsize=8) + ax.set_title(title, fontsize=9) + ax.tick_params(labelsize=7) + ax.grid(alpha=0.25, lw=0.5) + + +# --------------------------------------------------------------------------- +# figures + + +LEGEND = ("blue BD blade, red AD blade, green blade root, " + "purple BD reaction, orange hub, grey tower") + + +def fig_geometry(cw, mr, lim, label, out): + fig = plt.figure(figsize=(15, 9.5)) + for row, (case, data) in enumerate((("clockwise", cw), ("mirrored", mr))): + for col, view in enumerate(FLAT_VIEWS): + ax = fig.add_subplot(2, 3, row * 3 + col + 1) + draw2d(ax, data, view[1]) + setup2d(ax, lim, view, f"{case} -- {view[0]}") + ax = fig.add_subplot(2, 3, row * 3 + 3, projection="3d") + draw(ax, data) + setup(ax, lim, f"{case} -- isometric") + fig.suptitle( + f"Geometry at {label}. Identical axes throughout. {LEGEND}", + fontsize=10, + ) + fig.tight_layout(rect=(0, 0, 1, 0.95)) + fig.savefig(out, dpi=130) + plt.close(fig) + + +def fig_overlay(cw, mr, lim, label, out, deviations): + fig = plt.figure(figsize=(15, 5.5)) + for col, view in enumerate(FLAT_VIEWS): + ax = fig.add_subplot(1, 3, col + 1) + draw2d(ax, cw, view[1], colour="#1f77b4", alpha=1.0) + draw2d(ax, mr, view[1], transform=S, colour="#d62728", alpha=0.6) + setup2d(ax, lim, view, view[0]) + ax = fig.add_subplot(1, 3, 3, projection="3d") + draw(ax, cw, colour="#1f77b4", alpha=1.0) + draw(ax, mr, transform=S, colour="#d62728", alpha=0.6) + setup(ax, lim, "isometric") + worst = max((v for v, _ in deviations.values()), default=float("nan")) + fig.suptitle( + f"Mirrored geometry with y -> -y re-applied (red) over clockwise (blue), {label}. " + f"They should coincide -- no blue should be visible. " + f"Largest node separation {worst:.3e} m", + fontsize=10, + ) + fig.tight_layout(rect=(0, 0, 1, 0.93)) + fig.savefig(out, dpi=130) + plt.close(fig) + + +def tip_paths(meshes, frames, pattern="AD_Blade_"): + """Tip position of each blade over the run.""" + out = {} + for name, byframe in sorted(meshes.items()): + if not name.startswith(pattern): + continue + pts = [] + for f in frames: + path = byframe.get(f) + if path is None: + continue + # The last point of the blade line mesh is the tip. + pts.append(read_vtp(path)["points"][-1]) + if pts: + out[name] = np.array(pts) + return out + + +def azimuth(path, hub): + """Unwrapped blade azimuth about the shaft, radians. + + Measured in the plane normal to the wind, from vertical, positive in the + sense a clockwise rotor turns when viewed from upwind. Looking downwind + with z up the frame is right-handed and +y runs to the left, so that sense + carries -y into +z, giving atan2(-y, z). + """ + d = path - hub + return np.unwrap(np.arctan2(-d[:, 1], d[:, 2])) + + +def fig_rotation(cw_paths, mr_paths, cw_hub, mr_hub, out): + """Sense of rotation. + + The earlier version of this figure drew every frame of the run. The rotor + turns about four times in twenty seconds, so the tip paths wrapped over + themselves and the colour gradient aliased into noise that showed nothing at + all. It is restricted to a single revolution here, and the direction of + travel is drawn as arrows taken from consecutive positions rather than left + to be inferred from colour. The right-hand panel is the unambiguous one: + the sign of the slope is the sense of rotation, and no question of how the + view is oriented enters into it. + """ + fig = plt.figure(figsize=(15, 6.0)) + cases = (("clockwise", cw_paths, cw_hub, "#1f77b4"), + ("mirrored", mr_paths, mr_hub, "#d62728")) + + for col, (label, paths, hub, _) in enumerate(cases): + ax = fig.add_subplot(1, 3, col + 1) + # One blade only. Drawing all three puts three colour ramps on one + # circle, which reads as a ramp that cycles and hides the very thing + # the panel exists to show. + for name, p in sorted(paths.items())[:1]: + psi = azimuth(p, hub) + # One revolution's worth of frames, or the whole run if shorter. + adv = np.abs(psi - psi[0]) + n = int(np.argmax(adv >= 2 * np.pi)) + 1 if (adv >= 2 * np.pi).any() else len(p) + q = p[:n] + u, v = q[:, 1], q[:, 2] + ax.scatter(u, v, c=np.arange(n), cmap="viridis", s=14, zorder=3) + step = max(1, n // 16) + for k in range(0, n - step, step): + ax.annotate( + "", xy=(u[k + step], v[k + step]), xytext=(u[k], v[k]), + arrowprops=dict(arrowstyle="-|>", lw=1.6, color="k", + shrinkA=0, shrinkB=0), + zorder=4, + ) + ax.annotate(name.replace("AD_Blade_R1", ""), (u[0], v[0]), + fontsize=9, weight="bold", zorder=5) + ax.plot([hub[1]], [hub[2]], "k+", ms=14) + ax.invert_xaxis() # looking downwind: +y to the left + ax.set_aspect("equal") + ax.set_xlabel("y (m), increasing to the left", fontsize=8) + ax.set_ylabel("z (m)", fontsize=8) + ax.set_title(f"{label}: blade 1 tip path, one revolution", fontsize=10) + ax.grid(alpha=0.25, lw=0.5) + + ax = fig.add_subplot(1, 3, 3) + for label, paths, hub, colour in cases: + for i, (name, p) in enumerate(sorted(paths.items())): + psi = np.degrees(azimuth(p, hub) - azimuth(p, hub)[0]) + ax.plot(np.arange(len(psi)), psi, color=colour, lw=1.4, + label=label if i == 0 else None) + ax.axhline(0, color="k", lw=0.6) + ax.set_xlabel("frame", fontsize=8) + ax.set_ylabel("azimuth advance from start (deg)", fontsize=8) + ax.set_title("unwrapped azimuth: the slope is the sense", fontsize=10) + ax.grid(alpha=0.25, lw=0.5) + ax.legend(fontsize=8) + + fig.suptitle( + "Sense of rotation, viewed from upwind looking downwind (+x into page). " + "The two rotors must turn in opposite senses.", + fontsize=11, + ) + fig.tight_layout(rect=(0, 0, 1, 0.93)) + fig.savefig(out, dpi=130) + plt.close(fig) + + +def hub_position(meshes, frame): + """Hub node position at a frame, for the azimuth origin.""" + for name, byframe in meshes.items(): + if "HubMotion" in name and "_Reference" not in name: + path = byframe.get(frame) or byframe.get(None) + if path: + return read_vtp(path)["points"][0] + return np.array([0.0, 0.0, 90.0]) + + +# --------------------------------------------------------------------------- + + + +# --------------------------------------------------------------------------- +# animation + + +class MeshCache: + """Parsed meshes, kept so each .vtp is read once. + + A run of this length holds four thousand files per case and every figure + wants the same ones, so without this the encode spends most of its time in + the XML parser. The meshes are small -- a blade is nineteen points -- so + holding all of them costs little. + """ + + def __init__(self, meshes, want=None): + self.meshes = meshes + self.want = want + self._cache = {} + + def at(self, frame): + if frame not in self._cache: + self._cache[frame] = collect(self.meshes, frame, self.want) + return self._cache[frame] + + +def animation_limits(cw, mr, frames): + """Axis limits fixed for the whole animation. + + Taken over a spread of frames rather than one, so that nothing wanders out + of frame part way through -- an axis that rescales mid-clip would make two + cases look different when they are not. + """ + sample = frames[:: max(1, len(frames) // 12)] + [frames[-1]] + return frame_limits(*[cw.at(f) for f in sample], *[mr.at(f) for f in sample]) + + +def rotation_bounds(cw_paths, mr_paths, cw_hub, mr_hub): + """Fixed axis limits for the rotation animation. + + Every axis in an animation has to be pinned to its final extent. Left to + autoscale, the first frames hold one point, so the tip circle appears to + grow out of nothing and the azimuth trace always touches the top of its + box -- both of which show motion that is not there. + """ + tips = np.vstack([p for p in list(cw_paths.values()) + list(mr_paths.values())]) + y, z = tips[:, 1], tips[:, 2] + pad = 0.08 * max(np.ptp(y), np.ptp(z)) + yz = (y.min() - pad, y.max() + pad, z.min() - pad, z.max() + pad) + + psis = [] + for paths, hub in ((cw_paths, cw_hub), (mr_paths, mr_hub)): + for p in sorted(paths.values(), key=lambda a: a[0, 1])[:1]: + a = azimuth(p, hub) + psis.append(np.degrees(a - a[0])) + # Unwrapping assumes successive samples are less than half a revolution + # apart. A large --stride breaks that: at 0.85 rev per sample the unwrap + # resolves the wrong way and the azimuth trace understates the turning by + # a factor of several, quietly. + for q in psis: + step = np.abs(np.diff(q)).max() if len(q) > 1 else 0.0 + if step > 150.0: + print(f"warning: {step:.0f} deg between sampled frames -- the stride " + "aliases the azimuth unwrap; use a smaller --stride for a " + "trustworthy rotation panel", file=sys.stderr) + break + + lo = min(float(q.min()) for q in psis) + hi = max(float(q.max()) for q in psis) + m = 0.05 * (hi - lo) + return yz, (lo - m, hi + m) + + +def anim_rotation(fig, axes, cw_paths, mr_paths, cw_hub, mr_hub, upto, nframes, + bounds): + """One frame of the rotation animation: the trace accumulated so far.""" + (y0, y1, z0, z1), (psi0, psi1) = bounds + ax_cw, ax_mr, ax_psi = axes + cases = (("clockwise", cw_paths, cw_hub, ax_cw, "#1f77b4"), + ("mirrored", mr_paths, mr_hub, ax_mr, "#d62728")) + + for label, paths, hub, ax, _ in cases: + ax.cla() + for name, p in sorted(paths.items())[:1]: + q = p[: upto + 1] + ax.plot(q[:, 1], q[:, 2], "-", color="0.7", lw=1.0, zorder=2) + ax.scatter(q[:, 1], q[:, 2], c=np.arange(len(q)), cmap="viridis", + s=10, vmin=0, vmax=nframes - 1, zorder=3) + ax.plot(q[-1, 1], q[-1, 2], "o", color="k", ms=9, zorder=5) + ax.plot([hub[1]], [hub[2]], "k+", ms=14) + ax.set_xlim(y0, y1) + ax.set_ylim(z0, z1) + ax.set_aspect("equal") + ax.invert_xaxis() + ax.set_xlabel("y (m), increasing to the left", fontsize=8) + ax.set_ylabel("z (m)", fontsize=8) + ax.set_title(f"{label}: blade 1 tip", fontsize=10) + ax.grid(alpha=0.25, lw=0.5) + + ax_psi.cla() + for label, paths, hub, _, colour in cases: + for i, (name, p) in enumerate(sorted(paths.items())[:1]): + psi = np.degrees(azimuth(p, hub) - azimuth(p, hub)[0]) + ax_psi.plot(np.arange(upto + 1), psi[: upto + 1], color=colour, lw=1.8, + label=label if i == 0 else None) + ax_psi.axhline(0, color="k", lw=0.6) + ax_psi.set_xlim(0, nframes - 1) + ax_psi.set_ylim(psi0, psi1) + ax_psi.set_xlabel("frame", fontsize=8) + ax_psi.set_ylabel("azimuth advance from start (deg)", fontsize=8) + ax_psi.set_title("unwrapped azimuth: the slope is the sense", fontsize=10) + ax_psi.grid(alpha=0.25, lw=0.5) + ax_psi.legend(fontsize=8, loc="upper left") + + +def encode(pattern, out, fps): + """PNG sequence to H.264 mp4, the format a GitHub PR comment accepts.""" + try: + import imageio_ffmpeg + exe = imageio_ffmpeg.get_ffmpeg_exe() + except Exception: + exe = shutil.which("ffmpeg") + if not exe: + raise SystemExit("no ffmpeg available; install imageio-ffmpeg or ffmpeg") + + cmd = [ + exe, "-y", "-loglevel", "error", + "-framerate", f"{fps:.6f}", "-i", pattern, + # H.264 with yuv420p needs even dimensions, and a figure saved at an + # arbitrary dpi rarely has them. + "-vf", "pad=ceil(iw/2)*2:ceil(ih/2)*2:0:0:white", + "-c:v", "libx264", "-preset", "slow", "-crf", "23", + "-pix_fmt", "yuv420p", "-movflags", "+faststart", + out, + ] + subprocess.run(cmd, check=True) + return out + + +def animate(cw_meshes, mr_meshes, frames, out_dir, want, fps, dpi, dt): + """Write geometry.mp4, overlay.mp4 and rotation.mp4.""" + cw = MeshCache(cw_meshes, want) + mr = MeshCache(mr_meshes, want) + lim = animation_limits(cw, mr, frames) + + tmp = os.path.join(out_dir, "_frames") + if os.path.isdir(tmp): + shutil.rmtree(tmp) + os.makedirs(tmp) + + # Figures are built once and their axes cleared each frame; rebuilding a + # figure per frame is most of the cost otherwise. + fig_g = plt.figure(figsize=(15, 9.5)) + ax_g = [fig_g.add_subplot(2, 3, k + 1) for k in (0, 1)] + \ + [fig_g.add_subplot(2, 3, 3, projection="3d")] + \ + [fig_g.add_subplot(2, 3, k + 1) for k in (3, 4)] + \ + [fig_g.add_subplot(2, 3, 6, projection="3d")] + sup_g = fig_g.suptitle("", fontsize=10) + + fig_o = plt.figure(figsize=(15, 5.5)) + ax_o = [fig_o.add_subplot(1, 3, 1), fig_o.add_subplot(1, 3, 2), + fig_o.add_subplot(1, 3, 3, projection="3d")] + sup_o = fig_o.suptitle("", fontsize=10) + + fig_r = plt.figure(figsize=(15, 6.0)) + ax_r = [fig_r.add_subplot(1, 3, k + 1) for k in range(3)] + sup_r = fig_r.suptitle( + "Sense of rotation, viewed from upwind looking downwind (+x into page). " + "The two rotors must turn in opposite senses.", fontsize=11) + + cw_paths = tip_paths(cw_meshes, frames) + mr_paths = tip_paths(mr_meshes, frames) + cw_hub = hub_position(cw_meshes, frames[0]) + mr_hub = hub_position(mr_meshes, frames[0]) + rbounds = rotation_bounds(cw_paths, mr_paths, cw_hub, mr_hub) + + for k, f in enumerate(frames): + dcw, dmr = cw.at(f), mr.at(f) + label = when(dt, f) + + for a in ax_g: + a.cla() + for col, view in enumerate(FLAT_VIEWS): + draw2d(ax_g[col], dcw, view[1]) + setup2d(ax_g[col], lim, view, f"clockwise -- {view[0]}") + draw2d(ax_g[3 + col], dmr, view[1]) + setup2d(ax_g[3 + col], lim, view, f"mirrored -- {view[0]}") + draw(ax_g[2], dcw) + setup(ax_g[2], lim, "clockwise -- isometric") + draw(ax_g[5], dmr) + setup(ax_g[5], lim, "mirrored -- isometric") + sup_g.set_text(f"Geometry at {label}. Identical axes throughout. {LEGEND}") + fig_g.savefig(os.path.join(tmp, f"geometry_{k:05d}.png"), dpi=dpi) + + for a in ax_o: + a.cla() + for col, view in enumerate(FLAT_VIEWS): + draw2d(ax_o[col], dcw, view[1], colour="#1f77b4", alpha=1.0) + draw2d(ax_o[col], dmr, view[1], transform=S, colour="#d62728", alpha=0.6) + setup2d(ax_o[col], lim, view, view[0]) + draw(ax_o[2], dcw, colour="#1f77b4", alpha=1.0) + draw(ax_o[2], dmr, transform=S, colour="#d62728", alpha=0.6) + setup(ax_o[2], lim, "isometric") + worst = max((v for v, _ in deviation(dcw, dmr).values()), + default=float("nan")) + sup_o.set_text( + f"Mirrored geometry with y -> -y re-applied (red) over clockwise (blue), " + f"{label}. No blue should be visible. " + f"Largest node separation {worst:.3e} m") + fig_o.savefig(os.path.join(tmp, f"overlay_{k:05d}.png"), dpi=dpi) + + anim_rotation(fig_r, ax_r, cw_paths, mr_paths, cw_hub, mr_hub, k, + len(frames), rbounds) + fig_r.savefig(os.path.join(tmp, f"rotation_{k:05d}.png"), dpi=dpi) + + if k % 20 == 0 or k == len(frames) - 1: + print(f" frame {k + 1}/{len(frames)} ({label})", flush=True) + + for fig in (fig_g, fig_o, fig_r): + plt.close(fig) + + outs = [] + for stem in ("geometry", "overlay", "rotation"): + out = os.path.join(out_dir, f"{stem}.mp4") + encode(os.path.join(tmp, f"{stem}_%05d.png"), out, fps) + outs.append(out) + print(f" {out} {os.path.getsize(out) / 1e6:.2f} MB") + + shutil.rmtree(tmp) + return outs + +# Meshes built by sweeping an angle -- the ground quad, the tower, nacelle and +# hub surfaces -- have their vertex order reversed by the reflection, so a +# node-by-node comparison reports a large separation for two identical shapes. +# They are compared as point clouds instead. +_SWEPT = ("GroundSurface", "TowerSurface", "NacelleSurface", "HubSurface") + +# The blade index is not reliably the end of a mesh name: it is followed by +# "_Reference" on reference meshes and by "Surface" on surface meshes. Matching +# the end of the name silently compared a blade against itself, which shows up as +# a clean 120 degree azimuth error and looks convincingly like a real defect. +_BLADE_RE = re.compile(r"B(\d+)") + + +def partner(name): + """The mirrored mesh a clockwise mesh should be compared against. + + Blade 1 lies on the mirror plane and blades 2 and 3 exchange. + """ + swap = {"2": "3", "3": "2"} + return _BLADE_RE.sub(lambda m: "B" + swap.get(m.group(1), m.group(1)), name, count=1) + + +def _cloud_sep(a, b): + """Largest distance from a point of b to the nearest point of a.""" + step = max(1, len(a) // 1500) + a, b = a[::step], b[::step] + d = np.linalg.norm(b[:, None, :] - a[None, :, :], axis=2) + return float(d.min(axis=1).max()) + + +def deviation(cw, mr): + """Largest node separation between each clockwise mesh and its mirrored + partner with the mirror re-applied. + + Returns {name: (separation, ordered)} where ordered is False for the swept + shapes measured as point clouds. + """ + out = {} + for name, mesh in cw.items(): + p = partner(name) + if p not in mr: + continue + a = mesh["points"] + b = mr[p]["points"] @ S.T + if a.shape != b.shape: + continue + if any(k in name for k in _SWEPT): + out[name] = (_cloud_sep(a, b), False) + else: + out[name] = (float(np.abs(a - b).max()), True) + return out + + +def main(argv=None): + ap = argparse.ArgumentParser(description=__doc__, + formatter_class=argparse.RawDescriptionHelpFormatter) + ap.add_argument("--cw", required=True, help="clockwise case directory") + ap.add_argument("--mirror", required=True, help="mirrored case directory") + ap.add_argument("--out", required=True, help="directory to write PNGs into") + ap.add_argument("--frame", type=int, default=None, + help="frame for the geometry and overlay figures " + "(default: the last one)") + ap.add_argument("--no-ground", action="store_true", + help="omit the ground plane") + ap.add_argument("--with-reference", action="store_true", + help="also draw the _Reference meshes. They sit at the " + "reference azimuth rather than the frame's, so by " + "default they are measured but not drawn") + ap.add_argument("--animate", action="store_true", + help="also write geometry.mp4, overlay.mp4 and rotation.mp4 " + "over every frame") + ap.add_argument("--fps", type=float, default=None, + help="playback frame rate (default: the VTK output rate, " + "so the clip runs in real time)") + ap.add_argument("--dpi", type=int, default=100, + help="dpi for the animation frames (default 100)") + ap.add_argument("--stride", type=int, default=1, + help="use every Nth frame in the animation (default 1)") + args = ap.parse_args(argv) + + os.makedirs(args.out, exist_ok=True) + + cw_meshes, cw_frames = scan(args.cw) + mr_meshes, mr_frames = scan(args.mirror) + + common = sorted(set(cw_frames) & set(mr_frames)) + if not common: + raise SystemExit("the two cases share no animated frames") + frame = args.frame if args.frame is not None else common[-1] + if frame not in common: + raise SystemExit(f"frame {frame} not present in both cases") + + want = (lambda n: "GroundSurface" not in n) if args.no_ground else None + cw = collect(cw_meshes, frame, want) + mr = collect(mr_meshes, frame, want) + + # Every mesh is measured, including the reference ones, but drawing a + # reference mesh beside the current geometry puts a second copy of the rotor + # at a different azimuth in the same picture and reads as a defect. + devs = deviation(cw, mr) + if not args.with_reference: + cw = {k: v for k, v in cw.items() if "_Reference" not in k} + mr = {k: v for k, v in mr.items() if "_Reference" not in k} + + missing = set(cw) ^ set(mr) + if missing: + print(f"warning: meshes present in only one case: {sorted(missing)}", + file=sys.stderr) + + lim = frame_limits(cw, mr) + + dt = vtk_dt(args.cw) + label = when(dt, frame) + + fig_geometry(cw, mr, lim, label, os.path.join(args.out, "geometry.png")) + fig_overlay(cw, mr, lim, label, os.path.join(args.out, "overlay.png"), devs) + fig_rotation( + tip_paths(cw_meshes, common), + tip_paths(mr_meshes, common), + hub_position(cw_meshes, common[0]), + hub_position(mr_meshes, common[0]), + os.path.join(args.out, "rotation.png"), + ) + + if dt is not None: + print(f"frames {common[0]}..{common[-1]} at {dt:.4f} s spacing, " + f"t = 0 to {dt * common[-1]:.2f} s") + print(f"rendered {label}") + print(f"{len(cw)} meshes\n") + print("largest node separation after re-applying the mirror, per mesh") + print("(blades 2 and 3 compared against their permuted partners)") + for name in sorted(devs, key=lambda n: devs[n][0], reverse=True): + val, ordered = devs[name] + note = "" if ordered else " (point cloud; vertex order reverses)" + print(f" {name:<44s} {val:.6e} m{note}") + print(f"\nPNGs in {args.out}") + + if args.animate: + fps = args.fps if args.fps else (1.0 / dt if dt else 15.0) + seq = common[:: max(1, args.stride)] + # A stride changes how much simulated time each played frame covers, so + # the rate has to follow it or the clip no longer runs in real time. + if args.stride > 1 and args.fps is None: + fps = fps / args.stride + print(f"\nanimating {len(seq)} frames at {fps:.4f} fps " + f"({len(seq) / fps:.1f} s of video)") + animate(cw_meshes, mr_meshes, seq, args.out, want, fps, args.dpi, dt) + + return 0 + + +if __name__ == "__main__": + sys.exit(main()) From 62d9b9f9d7d4148dc84abf50da35a79b8401a8d2 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Tue, 25 Aug 2026 15:58:31 -0600 Subject: [PATCH 54/66] Mirror the airfoil coordinates in the VTK blade surfaces The blade surface written for VTK_type = 1 is built from the airfoil coordinate files rather than from the mesh, so it carries a sign of its own, and it was not being given one. A mirrored rotor was drawn with its aerofoils unreflected: the surfaces sat 2.33 m from where they belonged measured as point clouds, 6.84 m compared in vertex order, while every output channel, every node position and every node orientation agreed exactly. MeshWrVTK_Ln2Surface places each vertex at Position + TranslationDisp + matmul(xyz, Orientation) so AirfoilCoords component 1 rides row 1 of the node's direction cosine matrix and component 2 rides row 2. Under the mirror R' = S R S the rows do not transform alike: row 1 becomes S*r1 while row 2 becomes -S*r2. RotDir therefore belongs on component 2 alone, so that the two negations cancel and the leading edge stays the leading edge while the section is drawn as the mirror image of the tabulated aerofoil, which is how it is being used. All four placements were measured against the orientations the code actually writes: component 2 alone gives 0.000e+00, while as written gives 2.013 m, component 1 gives 4.666 m and both give 4.615 m. The node orientations were confirmed to satisfy R' = S R S exactly for both the AeroDyn and BeamDyn blade meshes before concluding the fault was in the coordinates, since a frame error would look much the same from the outside. After the fix the surfaces agree to 1.0e-05 m, which is the last decimal place the ASCII .vtp format writes and not a residual. The seventeen cases carrying the mirrorrotor label pass unchanged, as they must: these coordinates are consumed only by the three VTK surface writers and never reach the loads. check_vtk_surface_mirror.py guards it, and has been shown to fail when the factor is removed rather than merely to pass with it in place. It is run by run_guards.sh and takes about twelve seconds. This was found by looking at a rendered case, not by any tolerance. It is the first defect on this branch that only a visual inspection could have caught. Co-authored-by: Claude Opus 5 --- docs/source/user/glue-code/mirror_rotor.rst | 24 +++ modules/aerodyn/src/AeroDyn.f90 | 18 +- .../otherTests/check_vtk_surface_mirror.py | 166 ++++++++++++++++++ reg_tests/otherTests/run_guards.sh | 7 + 4 files changed, 211 insertions(+), 4 deletions(-) create mode 100644 reg_tests/otherTests/check_vtk_surface_mirror.py diff --git a/docs/source/user/glue-code/mirror_rotor.rst b/docs/source/user/glue-code/mirror_rotor.rst index 137346cba5..5dbf41d207 100644 --- a/docs/source/user/glue-code/mirror_rotor.rst +++ b/docs/source/user/glue-code/mirror_rotor.rst @@ -187,6 +187,30 @@ Both describe the same angle. The panel normal is a cross product of two true vectors and so is a pseudovector, while the rows of a direction cosine matrix are not; the two carry opposite signs under the reflection. +.. _glue-code-mirror-rotor-vtk: + +Visualisation surfaces +---------------------- + +The blade surface written for ``VTK_type = 1`` is built from the airfoil +coordinate files rather than from the mesh, so it carries its own sign. +``MeshWrVTK_Ln2Surface`` places each vertex at +``Position + TranslationDisp + matmul(xyz, Orientation)``, which puts +``AirfoilCoords`` component 1 along row 1 of the node's direction cosine matrix +and component 2 along row 2. Under :math:`R' = S R S` the rows do not transform +alike: row 1 becomes :math:`S\,r_1` while row 2 becomes :math:`-S\,r_2`. The +coordinates therefore carry ``RotDir`` on **component 2 alone**, so that the two +negations cancel and the leading edge remains the leading edge while the section +is drawn as the mirror image of the tabulated aerofoil, which is how it is being +used. Putting the factor on component 1, or on both, was measured and is wrong. + +This is visualisation only — these coordinates never reach the loads — but it is +worth recording, because it is the one part of the mirrored geometry that no +output channel and no node comparison can police. It was found by looking at a +rendered case, not by any tolerance: the aerofoils were drawn 2.33 m from where +they belonged while every channel and every node position agreed exactly. +``reg_tests/otherTests/check_vtk_surface_mirror.py`` guards it. + .. _glue-code-mirror-rotor-beamdyn: BeamDyn blades diff --git a/modules/aerodyn/src/AeroDyn.f90 b/modules/aerodyn/src/AeroDyn.f90 index 28d4e42012..7e8024cb20 100644 --- a/modules/aerodyn/src/AeroDyn.f90 +++ b/modules/aerodyn/src/AeroDyn.f90 @@ -179,10 +179,20 @@ subroutine AD_SetInitOut(MHK, WtrDpth, p, p_AD, InputFileData, AA_InitOut, InitO do j=1,InputFileData%BladeProps(k)%NumBlNds f = InputFileData%BladeProps(k)%BlAFID(j) - do i=1,NumCoords-1 - InitOut%BladeShape(k)%AirfoilCoords(1,i,j) = InputFileData%BladeProps(k)%BlChord(j)*( p_AD%AFI(f)%Y_Coord(i+1) - p_AD%AFI(f)%Y_Coord(1) ) - InitOut%BladeShape(k)%AirfoilCoords(2,i,j) = InputFileData%BladeProps(k)%BlChord(j)*( p_AD%AFI(f)%X_Coord(i+1) - p_AD%AFI(f)%X_Coord(1) ) - end do + ! MirrorRotor: these vertices are placed by MeshWrVTK_Ln2Surface as + ! matmul(xyz, Orientation), so component 1 rides row 1 of the node's + ! direction cosine matrix and component 2 rides row 2. Under the + ! mirror R' = S R S the rows do not transform alike: row 1 becomes + ! S*row1 while row 2 becomes -S*row2. RotDir therefore belongs on + ! component 2 alone, so that the two negations cancel and the leading + ! edge stays the leading edge while the section is drawn as the mirror + ! image of the tabulated airfoil, which is how it is being used. + ! Putting the factor on component 1, or on both, was measured and is + ! wrong. Visualisation only; these coordinates never reach the loads. + do i=1,NumCoords-1 + InitOut%BladeShape(k)%AirfoilCoords(1,i,j) = InputFileData%BladeProps(k)%BlChord(j)*( p_AD%AFI(f)%Y_Coord(i+1) - p_AD%AFI(f)%Y_Coord(1) ) + InitOut%BladeShape(k)%AirfoilCoords(2,i,j) = p%RotDir * InputFileData%BladeProps(k)%BlChord(j)*( p_AD%AFI(f)%X_Coord(i+1) - p_AD%AFI(f)%X_Coord(1) ) + end do end do end do diff --git a/reg_tests/otherTests/check_vtk_surface_mirror.py b/reg_tests/otherTests/check_vtk_surface_mirror.py new file mode 100644 index 0000000000..4255fc201d --- /dev/null +++ b/reg_tests/otherTests/check_vtk_surface_mirror.py @@ -0,0 +1,166 @@ +#!/usr/bin/env python3 +"""Check that the VTK blade surfaces mirror. + +The blade surface written for ``VTK_type = 1`` is built from the airfoil +coordinate files, not from the mesh nodes, and it is the one part of the +mirrored geometry that no output channel and no node comparison can police. A +mirrored rotor whose nodes are all in the right place can still be drawn with +its aerofoils the wrong way round, which is what happened: the coordinates were +carried across without ``RotDir`` and the surfaces sat 2.33 m from where they +belonged, while every channel and every node position agreed exactly. + +The vertices are placed by ``MeshWrVTK_Ln2Surface`` as +``matmul(xyz, Orientation)``, so ``AirfoilCoords`` component 1 rides row 1 of the +node's direction cosine matrix and component 2 rides row 2. Under ``R' = S R S`` +the rows do not transform alike -- row 1 becomes ``S*row1`` and row 2 becomes +``-S*row2`` -- so the coordinates need ``RotDir`` on component 2 alone for the +two negations to cancel. See ``AD_SetInitOut`` in ``modules/aerodyn/src/AeroDyn.f90``. + +Run it directly, or through ``run_guards.sh``:: + + python3 check_vtk_surface_mirror.py + python3 check_vtk_surface_mirror.py --keep # leave the runs in place + +It clones the registered pair `5MW_Land_BD_DLL_WTurb` and +`5MW_Land_BD_DLL_WTurb_MirrorRotor` from the build tree, so the DISCON library +resolves, shortens them, turns on surface output and compares. +""" + +from __future__ import annotations + +import argparse +import os +import re +import shutil +import subprocess +import sys +import tempfile + +import numpy as np + +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) +from render_vtk_pair import read_vtp, S # noqa: E402 + + +CW = "5MW_Land_BD_DLL_WTurb" +MR = "5MW_Land_BD_DLL_WTurb_MirrorRotor" + +# Blade 1 lies on the mirror plane; blades 2 and 3 exchange. +PAIRS = {"1": "1", "2": "3", "3": "2"} + +# The ASCII .vtp files carry five decimal places, so agreement cannot be +# demonstrated below 1e-5 m no matter how exact the arithmetic is. +TOL = 2.0e-5 + + +def repo_root(): + here = os.path.dirname(os.path.abspath(__file__)) + return os.environ.get("OPENFAST_REPO", os.path.abspath(os.path.join(here, "..", ".."))) + + +def stage(repo, work, tmax): + """Clone both cases from the staged build tree and turn on surface VTK.""" + built = os.path.join(repo, "build-docker-double", "reg_tests", "glue-codes", "openfast") + baseline = os.path.join(built, "5MW_Baseline") + if not os.path.isdir(baseline): + raise SystemExit(f"no staged 5MW_Baseline in {built}; run ctest once first") + # The decks reach for ../5MW_Baseline, and the mirrored deck also reaches for + # ../5MW_Land_BD_DLL_WTurb, so both must sit beside each other. + os.symlink(baseline, os.path.join(work, "5MW_Baseline")) + + for case in (CW, MR): + src = os.path.join(built, case) + if not os.path.isdir(src): + raise SystemExit(f"case not staged: {src}; run ctest -R {case} once first") + dst = os.path.join(work, case) + shutil.copytree(src, dst) + shutil.rmtree(os.path.join(dst, "vtk"), ignore_errors=True) + + fst = os.path.join(dst, case + ".fst") + with open(fst) as fh: + text = fh.read() + text = re.sub(r"^(\s*)\d+(\s+WrVTK\s)", r"\g<1>2\g<2>", text, flags=re.M) + text = re.sub(r"^(\s*)\d+(\s+VTK_type\s)", r"\g<1>1\g<2>", text, flags=re.M) + text = re.sub(r"^(\s*)[\d.]+(\s+TMax\s)", rf"\g<1>{tmax}\g<2>", text, flags=re.M) + with open(fst, "w") as fh: + fh.write(text) + + +def run(repo, work, case): + exe = os.path.join(repo, "build-docker-double", "glue-codes", "openfast", "openfast") + if not os.path.isfile(exe): + raise SystemExit(f"no openfast binary at {exe}") + d = os.path.join(work, case) + with open(os.path.join(d, "run.log"), "w") as log: + rc = subprocess.run([exe, case + ".fst"], cwd=d, stdout=log, stderr=log).returncode + if rc != 0: + raise SystemExit(f"{case} exited {rc}; see {d}/run.log") + + +def surfaces(work, case, blade): + """Every frame of one blade's surface, in file order.""" + vtk = os.path.join(work, case, "vtk") + pat = re.compile(rf"^{re.escape(case)}\.Blade_R1B{blade}Surface\.(\d+)\.vtp$") + found = [] + for fn in sorted(os.listdir(vtk)): + m = pat.match(fn) + if m: + found.append((int(m.group(1)), os.path.join(vtk, fn))) + return [p for _, p in sorted(found)] + + +def main(argv=None): + ap = argparse.ArgumentParser(description=__doc__, + formatter_class=argparse.RawDescriptionHelpFormatter) + ap.add_argument("--tmax", type=float, default=2.0, help="run length (s), default 2") + ap.add_argument("--tol", type=float, default=TOL, help=f"tolerance (m), default {TOL}") + ap.add_argument("--keep", action="store_true", help="keep the run directories") + args = ap.parse_args(argv) + + repo = repo_root() + work = tempfile.mkdtemp(prefix="vtk_surface_mirror_") + ok = True + try: + stage(repo, work, args.tmax) + for case in (CW, MR): + run(repo, work, case) + + for i, j in PAIRS.items(): + a_files = surfaces(work, CW, i) + b_files = surfaces(work, MR, j) + if not a_files: + print(f"FAIL blade {i}: no surface files written -- is VTK_type = 1 set, " + "and do the airfoils supply coordinates?") + ok = False + continue + if len(a_files) != len(b_files): + print(f"FAIL blade {i}->{j}: {len(a_files)} frames vs {len(b_files)}") + ok = False + continue + + worst = 0.0 + for pa, pb in zip(a_files, b_files): + a = read_vtp(pa)["points"] @ S.T + b = read_vtp(pb)["points"] + if a.shape != b.shape: + print(f"FAIL blade {i}->{j}: vertex counts differ, " + f"{a.shape[0]} vs {b.shape[0]}") + ok = False + break + worst = max(worst, float(np.abs(a - b).max())) + else: + verdict = "PASS" if worst <= args.tol else "FAIL" + ok &= worst <= args.tol + print(f"{verdict} blade {i}->{j} {len(a_files)} frames " + f"max separation {worst:.3e} m (tol {args.tol:.1e})") + finally: + if args.keep: + print(f"runs kept in {work}") + else: + shutil.rmtree(work, ignore_errors=True) + + return 0 if ok else 1 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/reg_tests/otherTests/run_guards.sh b/reg_tests/otherTests/run_guards.sh index 95ec028cc2..997cd1c69e 100755 --- a/reg_tests/otherTests/run_guards.sh +++ b/reg_tests/otherTests/run_guards.sh @@ -67,3 +67,10 @@ run aa_mirror "not yet supported with the AeroAcoustics" yes # rather than that it fires. If someone reintroduces a refusal for OLAF, both fail. run olaf_mirror "not yet supported with the OLAF" no run olaf_cw "not yet supported with the OLAF" no + +# The VTK blade surfaces are built from the airfoil coordinate files rather than +# from the mesh, so they carry a sign of their own that no channel comparison and +# no node comparison can reach. This uses the release build and takes about 12 s. +echo +echo "=== VTK surface mirror ===" +python3 "$HERE/check_vtk_surface_mirror.py" From 8e06416ad97cfb539a3766ebcc51b3c857259eb0 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Tue, 25 Aug 2026 16:38:38 -0600 Subject: [PATCH 55/66] Mirror the generic blade shapes in the VTK surface fallback The surface fallback was left unmirrored by the previous commit, which fixed only the path where the airfoil files supply coordinates. That was the wrong place to stop: a blade surface is written whether or not coordinates are available, so the fallback is not a corner case that can be skipped, it is the same picture drawn a different way. When BladeShape is left unallocated the caller synthesises a generic section instead, and that section needs the same sign for the same reason: component 2 rides row 2 of the node's direction cosine matrix, and under R' = S R S row 2 gains a minus sign that row 1 does not. Without it the section is drawn back to front about the pitch axis. Measured on the mirrored pair before the change, the generic S809 was 5.949 m out compared in vertex order and the rectangle 2.460 m; both are now exact. The rectangle is nearly immune, being symmetric about its own chord line, and it was predicted to be. It is not: its closing vertex sits at the midpoint of one long edge while the mirror of that point lies on the opposite edge, so exactly one vertex per node moves, one of five, forty-nine of two hundred and forty-five. The four corners were always right. Predicting immunity and measuring it gave different answers, which is the reason for measuring. BladeShape is not always unallocated for the obvious reason. Besides NumCoords being zero, the fallback is reached when the airfoil files merely disagree on how many coordinates they hold - a check the code itself calls overly restrictive, so a blade mixing airfoil families lands there without the user asking for it - and when there is no AeroDyn at all, where the blades come from BeamDyn or ElastoDyn and the shape is a rectangle. Simplified ElastoDyn writes no blade surface, having no blade mesh. The rotation direction had no route to the AeroDyn driver's copy of this routine: MirrorRotor is carried in RotInitInputType and nothing equivalent existed on the way out. RotDir joins RotInitOutputType so that it travels beside BladeShape, which is the data it qualifies. The generated types gain four lines and nothing else. The glue code takes its own copy from p_FAST%MirrorRotor. Both fallback routines take RotDir as a required argument rather than an optional one, so that a future caller has to decide rather than inherit a clockwise default by omission. check_vtk_surface_mirror.py now covers all three ways the surface is drawn, and each has been shown to fail when its sign is removed. The seventeen cases carrying the mirrorrotor label pass unchanged. Co-authored-by: Claude Opus 5 --- docs/source/user/glue-code/mirror_rotor.rst | 24 ++- modules/aerodyn/src/AeroDyn.f90 | 11 +- modules/aerodyn/src/AeroDyn_IO.f90 | 20 ++- modules/aerodyn/src/AeroDyn_Registry.txt | 1 + modules/aerodyn/src/AeroDyn_Types.f90 | 4 + modules/openfast-library/src/FAST_Subs.f90 | 38 +++-- .../otherTests/check_vtk_surface_mirror.py | 139 +++++++++++++----- 7 files changed, 180 insertions(+), 57 deletions(-) diff --git a/docs/source/user/glue-code/mirror_rotor.rst b/docs/source/user/glue-code/mirror_rotor.rst index 5dbf41d207..22ed6262a8 100644 --- a/docs/source/user/glue-code/mirror_rotor.rst +++ b/docs/source/user/glue-code/mirror_rotor.rst @@ -209,7 +209,29 @@ worth recording, because it is the one part of the mirrored geometry that no output channel and no node comparison can police. It was found by looking at a rendered case, not by any tolerance: the aerofoils were drawn 2.33 m from where they belonged while every channel and every node position agreed exactly. -``reg_tests/otherTests/check_vtk_surface_mirror.py`` guards it. + +The surface is drawn three different ways, and each carries the sign separately. +When the airfoil files supply coordinates, ``AD_SetInitOut`` builds the section. +When they do not, ``BladeShape`` is left unallocated and a generic section is +synthesised instead — an S809 by ``SetVTKDefaultBladeParams`` when AeroDyn is in +use, or a rectangle when the blades come from BeamDyn or ElastoDyn without it. +A surface is written either way; it is never skipped. Note that the fallback is +reached not only when ``NumCoords = 0`` but also when the airfoil files merely +disagree on how many coordinates they have, a check the code itself describes as +overly restrictive, so a blade mixing airfoil families can land there without the +user intending it. The rotation direction reaches the fallback through ``RotDir`` +in AeroDyn's initialisation output, and through ``p_FAST%MirrorRotor`` in the glue +code. + +The generic shapes are not exempt. Before the sign was applied the S809 fallback +was drawn 1.611 m out and the rectangle 0.615 m; the rectangle is nearly immune, +being symmetric about its own chord line, but only nearly, because its closing +vertex sits at the midpoint of one long edge and its mirror lies on the opposite +edge, displacing exactly one vertex per node. Simplified ElastoDyn is the one +configuration that writes no blade surface at all, having no blade mesh. + +``reg_tests/otherTests/check_vtk_surface_mirror.py`` guards all three paths, and +has been shown to fail on each when the sign is removed. .. _glue-code-mirror-rotor-beamdyn: diff --git a/modules/aerodyn/src/AeroDyn.f90 b/modules/aerodyn/src/AeroDyn.f90 index 7e8024cb20..09a8d52699 100644 --- a/modules/aerodyn/src/AeroDyn.f90 +++ b/modules/aerodyn/src/AeroDyn.f90 @@ -145,9 +145,16 @@ subroutine AD_SetInitOut(MHK, WtrDpth, p, p_AD, InputFileData, AA_InitOut, InitO ! set visualization data: - ! this check is overly restrictive, but it would be a lot of work to ensure that only the *used* airfoil + ! MirrorRotor: the rotation direction travels with the visualisation data because + ! the blade surface is not always built here. When the airfoil files carry no + ! coordinates, or carry differing numbers of them, BladeShape is left unallocated + ! and the caller synthesises a generic section instead; that fallback needs the + ! same sign this routine applies below. + InitOut%RotDir = p%RotDir + + ! this check is overly restrictive, but it would be a lot of work to ensure that only the *used* airfoil ! tables have the same number of coordinates. - if ( allocated(p_AD%AFI) ) then + if ( allocated(p_AD%AFI) ) then if ( p_AD%AFI(1)%NumCoords > 0 ) then NumCoords = p_AD%AFI(1)%NumCoords diff --git a/modules/aerodyn/src/AeroDyn_IO.f90 b/modules/aerodyn/src/AeroDyn_IO.f90 index 147d407f77..2c0c450d14 100644 --- a/modules/aerodyn/src/AeroDyn_IO.f90 +++ b/modules/aerodyn/src/AeroDyn_IO.f90 @@ -2491,7 +2491,7 @@ subroutine AD_SetVTKSurface(InitOutData_AD, u_AD, VTK_Surface, errStat, errMsg) do K=1, nBlades tipNode = u_AD%rotors(iWT)%BladeMotion(K)%NNodes cylNode = min(3,u_AD%rotors(iWT)%BladeMotion(K)%Nnodes) - call AD_SetVTKDefaultBladeParams(u_AD%rotors(iWT)%BladeMotion(K), VTK_Surface(iWT)%BladeShape(K), tipNode, rootNode, cylNode, errStat2, errMsg2, BlChord=InitOutData_AD%rotors(iWT)%BladeProps(k)%BlChord); if (Failed()) return + call AD_SetVTKDefaultBladeParams(u_AD%rotors(iWT)%BladeMotion(K), VTK_Surface(iWT)%BladeShape(K), tipNode, rootNode, cylNode, InitOutData_AD%rotors(iWT)%RotDir, errStat2, errMsg2, BlChord=InitOutData_AD%rotors(iWT)%BladeProps(k)%BlChord); if (Failed()) return end do endif enddo ! iWT, turbines @@ -2607,15 +2607,17 @@ subroutine AD_WrVTK_LinesPoints(u_AD, y_AD, RefPoint, VTK_count, OutFileRoot, tW end subroutine AD_WrVTK_LinesPoints !---------------------------------------------------------------------------------------------------------------------------------- !> This subroutine comes up with some default airfoils for blade surfaces for a given blade mesh, M. -SUBROUTINE AD_SetVTKDefaultBladeParams(M, BladeShape, tipNode, rootNode, cylNode, errStat, errMsg, BlChord) +SUBROUTINE AD_SetVTKDefaultBladeParams(M, BladeShape, tipNode, rootNode, cylNode, RotDir, errStat, errMsg, BlChord) TYPE(MeshType), INTENT(IN ) :: M !< The Mesh the defaults should be calculated for TYPE(AD_VTK_BLSurfaceType), INTENT(INOUT) :: BladeShape !< BladeShape to set to default values INTEGER(IntKi), INTENT(IN ) :: rootNode !< Index of root node (innermost node) for this mesh INTEGER(IntKi), INTENT(IN ) :: tipNode !< Index of tip node (outermost node) for this mesh INTEGER(IntKi), INTENT(IN ) :: cylNode !< Index of last node to have a cylinder shape + REAL(ReKi), INTENT(IN ) :: RotDir !< MirrorRotor: +1 normal, -1 mirrored. See the comment on the chordwise term below. INTEGER(IntKi), INTENT( OUT) :: errStat !< Error status of the operation CHARACTER(*), INTENT( OUT) :: errMsg !< Error message if errStat /= ErrID_None REAL(ReKi), OPTIONAL, INTENT(IN ) :: BlChord(:) + REAL(SiKi) :: chordSign !< RotDir as SiKi REAL(SiKi) :: bladeLength, chord, pitchAxis REAL(SiKi) :: bladeLengthFract, bladeLengthFract2, ratio, posLength ! temporary quantities REAL(SiKi) :: cylinderLength, x, y, angle @@ -2627,6 +2629,7 @@ SUBROUTINE AD_SetVTKDefaultBladeParams(M, BladeShape, tipNode, rootNode, cylNode ! default airfoil shape coordinates; uses S809 values from http://wind.nrel.gov/airfoils/Shapes/S809_Shape.html: real, parameter, dimension(N) :: xc=(/ 1.0,0.996203,0.98519,0.967844,0.945073,0.917488,0.885293,0.848455,0.80747,0.763042,0.715952,0.667064,0.617331,0.56783,0.519832,0.474243,0.428461,0.382612,0.33726,0.29297,0.250247,0.209576,0.171409,0.136174,0.104263,0.076035,0.051823,0.03191,0.01659,0.006026,0.000658,0.000204,0.0,0.000213,0.001045,0.001208,0.002398,0.009313,0.02323,0.04232,0.065877,0.093426,0.124111,0.157653,0.193738,0.231914,0.271438,0.311968,0.35337,0.395329,0.438273,0.48192,0.527928,0.576211,0.626092,0.676744,0.727211,0.776432,0.823285,0.86663,0.905365,0.938474,0.965086,0.984478,0.996141,1.0 /) real, parameter, dimension(N) :: yc=(/ 0.0,0.000487,0.002373,0.00596,0.011024,0.017033,0.023458,0.03028,0.037766,0.045974,0.054872,0.064353,0.074214,0.084095,0.093268,0.099392,0.10176,0.10184,0.10007,0.096703,0.091908,0.085851,0.078687,0.07058,0.061697,0.052224,0.042352,0.032299,0.02229,0.012615,0.003723,0.001942,-0.00002,-0.001794,-0.003477,-0.003724,-0.005266,-0.011499,-0.020399,-0.030269,-0.040821,-0.051923,-0.063082,-0.07373,-0.083567,-0.092442,-0.099905,-0.105281,-0.108181,-0.108011,-0.104552,-0.097347,-0.086571,-0.073979,-0.060644,-0.047441,-0.0351,-0.024204,-0.015163,-0.008204,-0.003363,-0.000487,0.000743,0.000775,0.00029,0.0 /) + chordSign = real(RotDir, SiKi) call AllocAry(BladeShape%AirfoilCoords, 2, N, M%NNodes, 'BladeShape%AirfoilCoords', errStat2, errMsg2) CALL SetErrStat(errStat2,errMsg2,errStat,errMsg,RoutineName) IF (errStat >= AbortErrLev) RETURN @@ -2657,8 +2660,13 @@ SUBROUTINE AD_SetVTKDefaultBladeParams(M, BladeShape, tipNode, rootNode, cylNode y = xc(j) - 0.5 angle = ATAN2( y, x) ! x,y coordinates for cylinder - BladeShape%AirfoilCoords(1,j,i) = chord*COS(angle) ! x (note that "chord" is really representing chord/2 here) - BladeShape%AirfoilCoords(2,j,i) = chord*SIN(angle) ! y (note that "chord" is really representing chord/2 here) + ! MirrorRotor: MeshWrVTK_Ln2Surface places these as matmul(xyz, Orientation), + ! so component 1 rides row 1 of the node's direction cosine matrix and + ! component 2 rides row 2. Under R' = S R S row 1 becomes S*row1 while row 2 + ! becomes -S*row2, so the chordwise term carries the sign and the thickness + ! term does not. Visualisation only. + BladeShape%AirfoilCoords(1,j,i) = chord*COS(angle) ! x (note that "chord" is really representing chord/2 here) + BladeShape%AirfoilCoords(2,j,i) = chordSign * chord*SIN(angle) ! y (note that "chord" is really representing chord/2 here) END DO ELSE ! create an airfoil for this node @@ -2667,8 +2675,8 @@ SUBROUTINE AD_SetVTKDefaultBladeParams(M, BladeShape, tipNode, rootNode, cylNode x = yc(j) y = xc(j) - pitchAxis ! x,y coordinates for airfoil - BladeShape%AirfoilCoords(1,j,i) = chord*x - BladeShape%AirfoilCoords(2,j,i) = chord*y + BladeShape%AirfoilCoords(1,j,i) = chord*x + BladeShape%AirfoilCoords(2,j,i) = chordSign * chord*y END DO END IF END DO ! nodes on mesh diff --git a/modules/aerodyn/src/AeroDyn_Registry.txt b/modules/aerodyn/src/AeroDyn_Registry.txt index 252da946f9..bfe71b34f2 100644 --- a/modules/aerodyn/src/AeroDyn_Registry.txt +++ b/modules/aerodyn/src/AeroDyn_Registry.txt @@ -156,6 +156,7 @@ 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 ReKi RotDir - 1.0 - "Rotor rotation direction: +1 normal (CW viewed from upwind), -1 mirrored (CCW). Needed alongside BladeShape so the VTK surface fallback can mirror the generic section." - typedef ^ RotInitOutputType AD_BladePropsType BladeProps {:} - - "blade property information from blade input files" - typedef ^ RotInitOutputType ReKi TwrElev {:} - - "Elevation at tower node" m typedef ^ RotInitOutputType ReKi TwrDiam {:} - - "Diameter of tower at node" m diff --git a/modules/aerodyn/src/AeroDyn_Types.f90 b/modules/aerodyn/src/AeroDyn_Types.f90 index 97b498b8fd..22d35b2a57 100644 --- a/modules/aerodyn/src/AeroDyn_Types.f90 +++ b/modules/aerodyn/src/AeroDyn_Types.f90 @@ -176,6 +176,7 @@ MODULE AeroDyn_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(AD_BladeShape) , DIMENSION(:), ALLOCATABLE :: BladeShape !< airfoil coordinates for each blade [m] + REAL(ReKi) :: RotDir = 1.0 !< Rotor rotation direction: +1 normal (CW viewed from upwind), -1 mirrored (CCW). Needed alongside BladeShape so the VTK surface fallback can mirror the generic section. [-] TYPE(AD_BladePropsType) , DIMENSION(:), ALLOCATABLE :: BladeProps !< blade property information from blade input files [-] REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: TwrElev !< Elevation at tower node [m] REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: TwrDiam !< Diameter of tower at node [m] @@ -1611,6 +1612,7 @@ subroutine AD_CopyRotInitOutputType(SrcRotInitOutputTypeData, DstRotInitOutputTy if (ErrStat >= AbortErrLev) return end do end if + DstRotInitOutputTypeData%RotDir = SrcRotInitOutputTypeData%RotDir if (allocated(SrcRotInitOutputTypeData%BladeProps)) then LB(1:1) = lbound(SrcRotInitOutputTypeData%BladeProps) UB(1:1) = ubound(SrcRotInitOutputTypeData%BladeProps) @@ -1718,6 +1720,7 @@ subroutine AD_PackRotInitOutputType(RF, Indata) call AD_PackBladeShape(RF, InData%BladeShape(i1)) end do end if + call RegPack(RF, InData%RotDir) call RegPack(RF, allocated(InData%BladeProps)) if (allocated(InData%BladeProps)) then call RegPackBounds(RF, 1, lbound(InData%BladeProps), ubound(InData%BladeProps)) @@ -1758,6 +1761,7 @@ subroutine AD_UnPackRotInitOutputType(RF, OutData) call AD_UnpackBladeShape(RF, OutData%BladeShape(i1)) ! BladeShape end do end if + call RegUnpack(RF, OutData%RotDir); if (RegCheckErr(RF, RoutineName)) return if (allocated(OutData%BladeProps)) deallocate(OutData%BladeProps) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return if (IsAllocAssoc) then diff --git a/modules/openfast-library/src/FAST_Subs.f90 b/modules/openfast-library/src/FAST_Subs.f90 index 7aba321103..c7c07130e8 100644 --- a/modules/openfast-library/src/FAST_Subs.f90 +++ b/modules/openfast-library/src/FAST_Subs.f90 @@ -3851,6 +3851,7 @@ SUBROUTINE SetVTKParameters(p_FAST, InitOutData_ED, InitOutData_SED, InitOutData REAL(SiKi) :: x, y REAL(SiKi) :: TwrDiam_top, TwrDiam_base, TwrRatio, TwrLength REAL(SiKi) :: BladeLength, HubRad + REAL(ReKi) :: VTKRotDir INTEGER(IntKi) :: topNode, baseNode INTEGER(IntKi) :: NumBl, k, Indx LOGICAL :: UseADtwr @@ -4012,6 +4013,14 @@ SUBROUTINE SetVTKParameters(p_FAST, InitOutData_ED, InitOutData_SED, InitOutData return end if + ! MirrorRotor: the generic blade shapes below are synthesised here rather than taken + ! from AeroDyn, so they need the rotation direction to be drawn the right way round. + ! Only rotor 1 is visualised by this routine, as the TODOs below record. + VTKRotDir = 1.0_ReKi + if (allocated(p_FAST%MirrorRotor)) then + if (p_FAST%MirrorRotor(1)) VTKRotDir = -1.0_ReKi + end if + IF ( p_FAST%CompAero == Module_AD ) THEN ! These meshes may have airfoil data associated with nodes... IF (ALLOCATED(InitOutData_AD%rotors(1)%BladeShape)) THEN @@ -4028,7 +4037,7 @@ SUBROUTINE SetVTKParameters(p_FAST, InitOutData_ED, InitOutData_SED, InitOutData tipNode = AD%Input(1)%rotors(1)%BladeMotion(K)%NNodes cylNode = min(3,AD%Input(1)%rotors(1)%BladeMotion(K)%Nnodes) - call SetVTKDefaultBladeParams(AD%Input(1)%rotors(1)%BladeMotion(K), p_FAST%VTK_Surface%BladeShape(K), tipNode, rootNode, cylNode, 1, ErrStat2, ErrMsg2) + call SetVTKDefaultBladeParams(AD%Input(1)%rotors(1)%BladeMotion(K), p_FAST%VTK_Surface%BladeShape(K), tipNode, rootNode, cylNode, 1, VTKRotDir, ErrStat2, ErrMsg2) CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) IF (ErrStat >= AbortErrLev) RETURN END DO @@ -4041,7 +4050,7 @@ SUBROUTINE SetVTKParameters(p_FAST, InitOutData_ED, InitOutData_SED, InitOutData tipNode = BD%y(k)%BldMotion%NNodes cylNode = min(3,BD%y(k)%BldMotion%NNodes) - call SetVTKDefaultBladeParams(BD%y(k)%BldMotion, p_FAST%VTK_Surface%BladeShape(K), tipNode, rootNode, cylNode, 4, ErrStat2, ErrMsg2) + call SetVTKDefaultBladeParams(BD%y(k)%BldMotion, p_FAST%VTK_Surface%BladeShape(K), tipNode, rootNode, cylNode, 4, VTKRotDir, ErrStat2, ErrMsg2) CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) IF (ErrStat >= AbortErrLev) RETURN END DO @@ -4056,7 +4065,7 @@ SUBROUTINE SetVTKParameters(p_FAST, InitOutData_ED, InitOutData_SED, InitOutData tipNode = ED%y(1)%BladeLn2Mesh(K)%NNodes-1 cylNode = min(2,ED%y(1)%BladeLn2Mesh(K)%NNodes) - call SetVTKDefaultBladeParams(ED%y(1)%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, VTKRotDir, ErrStat2, ErrMsg2) CALL SetErrStat(ErrStat2,ErrMsg2,ErrStat,ErrMsg,RoutineName) IF (ErrStat >= AbortErrLev) RETURN END DO @@ -4094,7 +4103,7 @@ SUBROUTINE SetVTKParameters(p_FAST, InitOutData_ED, InitOutData_SED, InitOutData END SUBROUTINE SetVTKParameters !---------------------------------------------------------------------------------------------------------------------------------- !> This subroutine comes up with some default airfoils for blade surfaces for a given blade mesh, M. -SUBROUTINE SetVTKDefaultBladeParams(M, BladeShape, tipNode, rootNode, cylNode, iShape, ErrStat, ErrMsg) +SUBROUTINE SetVTKDefaultBladeParams(M, BladeShape, tipNode, rootNode, cylNode, iShape, RotDir, ErrStat, ErrMsg) TYPE(MeshType), INTENT(IN ) :: M !< The Mesh the defaults should be calculated for TYPE(FAST_VTK_BLSurfaceType), INTENT(INOUT) :: BladeShape !< BladeShape to set to default values @@ -4102,6 +4111,7 @@ SUBROUTINE SetVTKDefaultBladeParams(M, BladeShape, tipNode, rootNode, cylNode, i INTEGER(IntKi), INTENT(IN ) :: tipNode !< Index of tip node (outermost node) for this mesh INTEGER(IntKi), INTENT(IN ) :: cylNode !< Index of last node to have a cylinder shape INTEGER(IntKi), INTENT(IN ) :: iShape !< 1: S809, 2: circle, 3: square, 4: rectangle + REAL(ReKi), INTENT(IN ) :: RotDir !< MirrorRotor: +1 normal, -1 mirrored INTEGER(IntKi), INTENT( OUT) :: ErrStat !< Error status of the operation CHARACTER(*), INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None @@ -4109,6 +4119,13 @@ SUBROUTINE SetVTKDefaultBladeParams(M, BladeShape, tipNode, rootNode, cylNode, i REAL(SiKi) :: bladeLength, chord, pitchAxis REAL(SiKi) :: bladeLengthFract, bladeLengthFract2, ratio, posLength ! temporary quantities REAL(SiKi) :: cylinderLength, x, y, angle + ! MirrorRotor: MeshWrVTK_Ln2Surface places these vertices as matmul(xyz, Orientation), + ! so component 1 rides row 1 of the node's direction cosine matrix and component 2 + ! rides row 2. Under R' = S R S row 1 becomes S*row1 while row 2 becomes -S*row2, so + ! the chordwise term carries the sign and the thickness term does not. Without it a + ! mirrored rotor is drawn with its sections back to front about the pitch axis. + ! Visualisation only; these coordinates never reach the loads. + REAL(SiKi) :: chordSign INTEGER(IntKi) :: i, j INTEGER(IntKi) :: ErrStat2 CHARACTER(ErrMsgLen) :: ErrMsg2 @@ -4118,6 +4135,7 @@ SUBROUTINE SetVTKDefaultBladeParams(M, BladeShape, tipNode, rootNode, cylNode, i ErrStat = ErrID_None ErrMsg = '' + chordSign = real(RotDir, SiKi) select case (iShape) case (1) @@ -4181,8 +4199,8 @@ SUBROUTINE SetVTKDefaultBladeParams(M, BladeShape, tipNode, rootNode, cylNode, i x = yc(j) y = xc(j) - 0.5 ! x,y coordinates for cylinder - BladeShape%AirfoilCoords(1,j,i) = chord*x - BladeShape%AirfoilCoords(2,j,i) = chord*y + BladeShape%AirfoilCoords(1,j,i) = chord*x + BladeShape%AirfoilCoords(2,j,i) = chordSign * chord*y END DO enddo return ! We exit this routine @@ -4214,8 +4232,8 @@ SUBROUTINE SetVTKDefaultBladeParams(M, BladeShape, tipNode, rootNode, cylNode, i angle = ATAN2( y, x) ! x,y coordinates for cylinder - BladeShape%AirfoilCoords(1,j,i) = chord*COS(angle) ! x (note that "chord" is really representing chord/2 here) - BladeShape%AirfoilCoords(2,j,i) = chord*SIN(angle) ! y (note that "chord" is really representing chord/2 here) + BladeShape%AirfoilCoords(1,j,i) = chord*COS(angle) ! x (note that "chord" is really representing chord/2 here) + BladeShape%AirfoilCoords(2,j,i) = chordSign * chord*SIN(angle) ! y (note that "chord" is really representing chord/2 here) END DO ELSE @@ -4227,8 +4245,8 @@ SUBROUTINE SetVTKDefaultBladeParams(M, BladeShape, tipNode, rootNode, cylNode, i y = xc(j) - pitchAxis ! x,y coordinates for airfoil - BladeShape%AirfoilCoords(1,j,i) = chord*x - BladeShape%AirfoilCoords(2,j,i) = chord*y + BladeShape%AirfoilCoords(1,j,i) = chord*x + BladeShape%AirfoilCoords(2,j,i) = chordSign * chord*y END DO END IF diff --git a/reg_tests/otherTests/check_vtk_surface_mirror.py b/reg_tests/otherTests/check_vtk_surface_mirror.py index 4255fc201d..85d809c535 100644 --- a/reg_tests/otherTests/check_vtk_surface_mirror.py +++ b/reg_tests/otherTests/check_vtk_surface_mirror.py @@ -16,9 +16,27 @@ ``-S*row2`` -- so the coordinates need ``RotDir`` on component 2 alone for the two negations to cancel. See ``AD_SetInitOut`` in ``modules/aerodyn/src/AeroDyn.f90``. +Three configurations are checked, because the surface is drawn three different +ways and each carries the sign separately: + +``coords`` + The airfoil files supply coordinates, and ``AD_SetInitOut`` builds the + section. This is the normal case. +``nocoords`` + ``NumCoords = 0``, so ``BladeShape`` is never allocated and the glue code + synthesises a generic S809 section instead. The same fallback is reached + when the airfoil files merely disagree on how many coordinates they have, + which the code itself calls an overly restrictive check. +``noaero`` + ``CompAero = 0``, so the blades come from BeamDyn and the fallback draws a + rectangle. Nearly symmetric, so nearly immune -- but only nearly: the + closing vertex of the rectangle sits at the midpoint of one long edge and + its mirror lies on the opposite edge, which displaces one vertex per node. + Run it directly, or through ``run_guards.sh``:: python3 check_vtk_surface_mirror.py + python3 check_vtk_surface_mirror.py --only coords python3 check_vtk_surface_mirror.py --keep # leave the runs in place It clones the registered pair `5MW_Land_BD_DLL_WTurb` and @@ -52,13 +70,39 @@ # demonstrated below 1e-5 m no matter how exact the arithmetic is. TOL = 2.0e-5 +# Each draws the surface a different way, and each carries the sign separately. +MODES = ("coords", "nocoords", "noaero") + def repo_root(): here = os.path.dirname(os.path.abspath(__file__)) return os.environ.get("OPENFAST_REPO", os.path.abspath(os.path.join(here, "..", ".."))) -def stage(repo, work, tmax): +def strip_coords(work, airfoil_src, aero_deck): + """Copy the airfoil files with NumCoords switched off and point the deck at them. + + Setting NumCoords to 0 is what a user does when they have no profile geometry + to hand, and it sends the surface down the generic-shape fallback. + """ + dst = os.path.join(work, "Airfoils_nocoords") + os.makedirs(dst, exist_ok=True) + for fn in os.listdir(airfoil_src): + if not fn.endswith(".dat"): + continue + with open(os.path.join(airfoil_src, fn)) as fh: + text = fh.read() + text = re.sub(r'^@"[^"]*"(\s+NumCoords)', r"0\1", text, flags=re.M) + with open(os.path.join(dst, fn), "w") as fh: + fh.write(text) + with open(aero_deck) as fh: + text = fh.read() + text = text.replace('"../5MW_Baseline/Airfoils/', '"../Airfoils_nocoords/') + with open(aero_deck, "w") as fh: + fh.write(text) + + +def stage(repo, work, tmax, mode): """Clone both cases from the staged build tree and turn on surface VTK.""" built = os.path.join(repo, "build-docker-double", "reg_tests", "glue-codes", "openfast") baseline = os.path.join(built, "5MW_Baseline") @@ -82,9 +126,20 @@ def stage(repo, work, tmax): text = re.sub(r"^(\s*)\d+(\s+WrVTK\s)", r"\g<1>2\g<2>", text, flags=re.M) text = re.sub(r"^(\s*)\d+(\s+VTK_type\s)", r"\g<1>1\g<2>", text, flags=re.M) text = re.sub(r"^(\s*)[\d.]+(\s+TMax\s)", rf"\g<1>{tmax}\g<2>", text, flags=re.M) + if mode == "noaero": + # No AeroDyn at all, so the blades come from BeamDyn and the fallback + # draws a rectangle. ServoDyn goes too, since its controller expects + # aerodynamic torque. + text = re.sub(r"^(\s*)\d+(\s+CompAero\s)", r"\g<1>0\g<2>", text, flags=re.M) + text = re.sub(r"^(\s*)\d+(\s+CompServo\s)", r"\g<1>0\g<2>", text, flags=re.M) with open(fst, "w") as fh: fh.write(text) + if mode == "nocoords": + strip_coords(work, + os.path.join(baseline, "Airfoils"), + os.path.join(work, CW, "NRELOffshrBsline5MW_Onshore_AeroDyn.dat")) + def run(repo, work, case): exe = os.path.join(repo, "build-docker-double", "glue-codes", "openfast", "openfast") @@ -115,49 +170,57 @@ def main(argv=None): ap.add_argument("--tmax", type=float, default=2.0, help="run length (s), default 2") ap.add_argument("--tol", type=float, default=TOL, help=f"tolerance (m), default {TOL}") ap.add_argument("--keep", action="store_true", help="keep the run directories") + ap.add_argument("--only", choices=MODES, help="check just one configuration") args = ap.parse_args(argv) repo = repo_root() - work = tempfile.mkdtemp(prefix="vtk_surface_mirror_") + modes = (args.only,) if args.only else MODES ok = True - try: - stage(repo, work, args.tmax) - for case in (CW, MR): - run(repo, work, case) - - for i, j in PAIRS.items(): - a_files = surfaces(work, CW, i) - b_files = surfaces(work, MR, j) - if not a_files: - print(f"FAIL blade {i}: no surface files written -- is VTK_type = 1 set, " - "and do the airfoils supply coordinates?") - ok = False - continue - if len(a_files) != len(b_files): - print(f"FAIL blade {i}->{j}: {len(a_files)} frames vs {len(b_files)}") - ok = False - continue - - worst = 0.0 - for pa, pb in zip(a_files, b_files): - a = read_vtp(pa)["points"] @ S.T - b = read_vtp(pb)["points"] - if a.shape != b.shape: - print(f"FAIL blade {i}->{j}: vertex counts differ, " - f"{a.shape[0]} vs {b.shape[0]}") + + for mode in modes: + work = tempfile.mkdtemp(prefix=f"vtk_surface_{mode}_") + try: + stage(repo, work, args.tmax, mode) + for case in (CW, MR): + run(repo, work, case) + + for i, j in PAIRS.items(): + a_files = surfaces(work, CW, i) + b_files = surfaces(work, MR, j) + if not a_files: + print(f"FAIL {mode:9s} blade {i}: no surface files written") ok = False - break - worst = max(worst, float(np.abs(a - b).max())) - else: - verdict = "PASS" if worst <= args.tol else "FAIL" - ok &= worst <= args.tol - print(f"{verdict} blade {i}->{j} {len(a_files)} frames " + continue + if len(a_files) != len(b_files): + print(f"FAIL {mode:9s} blade {i}->{j}: " + f"{len(a_files)} frames vs {len(b_files)}") + ok = False + continue + + worst = 0.0 + bad = False + for pa, pb in zip(a_files, b_files): + a = read_vtp(pa)["points"] @ S.T + b = read_vtp(pb)["points"] + if a.shape != b.shape: + print(f"FAIL {mode:9s} blade {i}->{j}: vertex counts differ, " + f"{a.shape[0]} vs {b.shape[0]}") + ok = False + bad = True + break + worst = max(worst, float(np.abs(a - b).max())) + if bad: + continue + good = worst <= args.tol + ok &= good + print(f"{'PASS' if good else 'FAIL'} {mode:9s} blade {i}->{j} " + f"{len(a_files)} frames {a_files and len(read_vtp(a_files[0])['points'])} verts " f"max separation {worst:.3e} m (tol {args.tol:.1e})") - finally: - if args.keep: - print(f"runs kept in {work}") - else: - shutil.rmtree(work, ignore_errors=True) + finally: + if args.keep: + print(f" runs kept in {work}") + else: + shutil.rmtree(work, ignore_errors=True) return 0 if ok else 1 From 052226cd27527d6abe32f574c3938a750ceaed3c Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Tue, 25 Aug 2026 17:06:49 -0600 Subject: [PATCH 56/66] Refuse a multi-rotor OpenFAST instance under FAST.Farm MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit FAST.Farm drives one OpenFAST instance per turbine, and every one of the twenty one rotor references in FASTWrapper is rotors(1). An instance declaring more than one rotor would therefore be simulated as though the others were absent: no error, no warning, and output that looks entirely reasonable. FAST.Farm had no check on NRotors at all — the name does not appear anywhere in its source. The check lives beside the other glue-code validation rather than in FASTWrapper because p_FAST%FarmIntegration is set before FAST_Init runs and the parameter type is intent(inout), so it survives into ValidateInputData. FASTWrapper is the only thing in the tree that sets that flag, so the message can name FAST.Farm without qualification. This has nothing to do with the mirrored rotor and is committed separately so it can be taken on its own. run_guards.sh gains a FAST.Farm section proving the refusal fires for a two-rotor instance and stays silent for a one-rotor one, with the control required to run to completion so that a deck which merely fails to initialise cannot pass as a guard that stayed quiet. Two things had to be got right for the control to run at all, and both are recorded in the script: the DISCON controller libraries are built rather than stored, so the case has to be staged from the build tree and not from r-test, and FAST.Farm is a separate executable that "make openfast" does not rebuild. The binary in the build tree was six days stale when this was written and still carried a guard message that had been removed from the branch, which is exactly the failure this section exists to catch. Co-authored-by: Claude Opus 5 --- modules/openfast-library/src/FAST_Subs.f90 | 8 ++ reg_tests/otherTests/run_guards.sh | 90 ++++++++++++++++++++++ 2 files changed, 98 insertions(+) diff --git a/modules/openfast-library/src/FAST_Subs.f90 b/modules/openfast-library/src/FAST_Subs.f90 index c7c07130e8..5f31bf6fe7 100644 --- a/modules/openfast-library/src/FAST_Subs.f90 +++ b/modules/openfast-library/src/FAST_Subs.f90 @@ -2209,6 +2209,14 @@ SUBROUTINE ValidateInputData(p, m_FAST, ErrStat, ErrMsg) end if + end if + + ! FAST.Farm drives one OpenFAST instance per turbine, and every rotor reference in + ! FASTWrapper is rotors(1). A multi-rotor instance would therefore simulate the + ! first rotor and silently ignore the rest, which is worse than refusing it. + ! FASTWrapper is the only thing that sets FarmIntegration. + if (p%FarmIntegration .and. p%NRotors > 1) then + CALL SetErrStat( ErrID_Fatal, 'Only one rotor per OpenFAST instance is supported with FAST.Farm.', ErrStat, ErrMsg, RoutineName ) end if ! Combinations not yet supported with a mirrored (counter-clockwise) rotor. Each of diff --git a/reg_tests/otherTests/run_guards.sh b/reg_tests/otherTests/run_guards.sh index 997cd1c69e..6acc20b884 100755 --- a/reg_tests/otherTests/run_guards.sh +++ b/reg_tests/otherTests/run_guards.sh @@ -74,3 +74,93 @@ run olaf_cw "not yet supported with the OLAF" no echo echo "=== VTK surface mirror ===" python3 "$HERE/check_vtk_surface_mirror.py" + +# --------------------------------------------------------------------------- +# FAST.Farm guards +# +# FAST.Farm is a separate executable and "make openfast" does not rebuild it. +# That is not hypothetical: when this check was written the binary in +# build-docker-double was six days stale and still carried a guard message that +# had been removed from the branch, which very nearly recorded a restriction +# that no longer exists. A check that runs FAST.Farm catches that. +# +# The debug build does not include FAST.Farm, so fall back to the release one. +FFBIN="" +for cand in "$REPO/build-docker-double-debug/glue-codes/fast-farm/FAST.Farm" \ + "$REPO/build-docker-double/glue-codes/fast-farm/FAST.Farm"; do + [ -x "$cand" ] && FFBIN="$cand" && break +done + +# Prefer the staged build tree: the DISCON controller libraries are built, not +# stored, so they do not exist in the r-test source tree at all, and a deck that +# cannot load its controller aborts before reaching any guard. +FRT=$REPO/reg_tests/r-test/glue-codes/fast-farm +FSTAGE=$REPO/build-docker-double/reg_tests/glue-codes/fast-farm +[ -d "$FSTAGE/5MW_Baseline/ServoData" ] && FSRC=$FSTAGE || FSRC=$FRT +FG=$GC/farm + +# $1 = variant name. Edits are applied to turbine 1 only; turbine 2 is the +# control within every run, so a guard that fires for the wrong turbine shows up. +mkfarm () { + local name=$1 + rm -rf "$FG/$name"; mkdir -p "$FG" + cp -r "$FSRC/TSinflow" "$FG/$name" + # Long enough to get through initialisation, short enough not to be a test run. + sed -i -E 's/^[0-9.]+([[:space:]]+TMax)/5.0\1/' "$FG/$name/FAST.Farm.fstf" +} + +# $1 = variant, $2 = text to look for, $3 = "yes" if it must appear +runfarm () { + local name=$1 expect=$2 want=$3 + if [ -z "$FFBIN" ]; then + echo "SKIP $name (no FAST.Farm binary; build it with 'make FAST.Farm')" + return + fi + cd "$FG/$name" || return + timeout 900 "$FFBIN" FAST.Farm.fstf > run.log 2>&1 + local rc=$? got=no + grep -qF "$expect" run.log && got=yes + if [ "$got" = "$want" ]; then + echo "PASS $name (rc=$rc) guard fired=$got, expected=$want" + else + echo "FAIL $name (rc=$rc) guard fired=$got, expected=$want" + grep -iE "FATAL|Error" run.log | head -4 | sed 's/^/ /' + fi +} + +echo +echo "=== FAST.Farm guard rails ===" + +# The siblings the decks reach for. Without them the runs abort while reading +# inputs, before reaching any guard, and a control that never initialises looks +# exactly like a control whose guard stayed silent. +mkdir -p "$FG" +ln -sfn "$FSRC/WAT_MannBoxDB" "$FG/WAT_MannBoxDB" +ln -sfn "$FSRC/5MW_Baseline" "$FG/5MW_Baseline" + +NROTOR_MSG="Only one rotor per OpenFAST instance is supported with FAST.Farm." + +# Control: one rotor, not mirrored. Neither guard may fire, and it must run. +mkfarm farm_control +runfarm farm_control "$NROTOR_MSG" no +runfarm farm_control "FAST.Farm terminated normally." yes + +# Multiple rotors in one instance. Every rotor reference in FASTWrapper is +# rotors(1), so rotors 2 and beyond would be simulated as though absent. +mkfarm farm_multirotor +sed -i -E 's/^([[:space:]]*)1([[:space:]]+NRotors)/\1 2\2/' "$FG/farm_multirotor/FFTest_WT1.fst" +sed -i -E 's/^([[:space:]]*)F([[:space:]]+MirrorRotor)/\1 F F\2/' "$FG/farm_multirotor/FFTest_WT1.fst" +# NRotors > 1 needs a second block of per-rotor input files or the deck will not +# read, and a deck that fails to read never reaches the guard. +awk '/^---------------------- OUTPUT/ && !ins { + print "---------------------- INPUT FILES Rotor 2 -------------------------------------"; + print "\"NRELOffshrBsline5MW_Onshore_ElastoDyn_8mps.dat\" EDFile"; + print "\"unused\" BDBldFile(1)"; + print "\"unused\" BDBldFile(2)"; + print "\"unused\" BDBldFile(3)"; + print "\"NRELOffshrBsline5MW_Onshore_ServoDyn_WT1.dat\" ServoFile"; + ins=1 } { print }' \ + "$FG/farm_multirotor/FFTest_WT1.fst" > "$FG/farm_multirotor/.tmp" \ + && mv "$FG/farm_multirotor/.tmp" "$FG/farm_multirotor/FFTest_WT1.fst" +runfarm farm_multirotor "$NROTOR_MSG" yes + From dd3cbb8de767c77cdd4f1001e196e96e82e8f195 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Tue, 25 Aug 2026 17:08:28 -0600 Subject: [PATCH 57/66] Refuse MirrorRotor with FAST.Farm until the wake coupling is verified A mirrored turbine in a farm ran without complaint and produced numbers that nothing had checked. FAST.Farm does not mention MirrorRotor anywhere in its source, and the combination was absent from the list of refusals, so it was neither supported nor refused. What is known to be right is narrow. The mirror is confined to its own OpenFAST instance, and since FAST.Farm gives every turbine a separate single-rotor instance, each reads its own flag and the blade surfaces render correctly; a farm mixing clockwise and counter-clockwise turbines draws each one properly. That is the whole of it. What is not known is the wake coupling. FWrap_CalcOutput forms the skew angle from a cross product of the disk-averaged wind with the disk normal, which is precisely the pseudovector pattern that has carried a sign at every other module boundary in this work, and the curled-wake model encodes a swirl direction of its own. Neither has been measured, and a farm is the case the flag exists for, so producing plausible numbers there without having checked them is the worst of the available outcomes. The refusal is recorded in the code comment, in the limitations table, and as remaining Phase 6 work. run_guards.sh proves the refusal fires for a mirrored turbine and stays silent for a clockwise one, with the control required to run to completion. Co-authored-by: Claude Opus 5 --- docs/source/user/glue-code/mirror_rotor.rst | 8 ++++++++ modules/openfast-library/src/FAST_Subs.f90 | 8 ++++++++ reg_tests/otherTests/run_guards.sh | 11 +++++++++++ 3 files changed, 27 insertions(+) diff --git a/docs/source/user/glue-code/mirror_rotor.rst b/docs/source/user/glue-code/mirror_rotor.rst index 22ed6262a8..c1607ba358 100644 --- a/docs/source/user/glue-code/mirror_rotor.rst +++ b/docs/source/user/glue-code/mirror_rotor.rst @@ -481,6 +481,14 @@ through. - ``CompAero = 3`` * - AeroAcoustics - ``CompAA = True`` in the AeroDyn input file + * - FAST.Farm + - Any turbine in a farm. The mirror is confined to its own OpenFAST + instance and the blade surfaces render correctly, since each turbine is a + separate single-rotor instance, but the wake coupling has not been + verified: ``FWrap_CalcOutput`` builds the skew angle from a cross product + of the disk-averaged wind with the disk normal, which is the pseudovector + pattern that carries a sign at every other module boundary here, and the + curled-wake model encodes a swirl direction of its own. .. _glue-code-mirror-rotor-verification: diff --git a/modules/openfast-library/src/FAST_Subs.f90 b/modules/openfast-library/src/FAST_Subs.f90 index 5f31bf6fe7..0b016f5cd6 100644 --- a/modules/openfast-library/src/FAST_Subs.f90 +++ b/modules/openfast-library/src/FAST_Subs.f90 @@ -2226,6 +2226,14 @@ SUBROUTINE ValidateInputData(p, m_FAST, ErrStat, ErrMsg) if (p%Linearize) CALL SetErrStat( ErrID_Fatal, 'MirrorRotor is not yet supported with linearization.', ErrStat, ErrMsg, RoutineName ) if (p%CompAeroMaps) CALL SetErrStat( ErrID_Fatal, 'MirrorRotor is not yet supported with the steady-state (aero map) solver.', ErrStat, ErrMsg, RoutineName ) if (p%CompAero == Module_ExtLd) CALL SetErrStat( ErrID_Fatal, 'MirrorRotor is not yet supported with ExtLoads.', ErrStat, ErrMsg, RoutineName ) + ! The mirror itself is confined to this instance, and the blade surfaces do + ! render correctly, since each turbine is its own single-rotor instance. What + ! is not verified is the wake coupling: FWrap_CalcOutput forms the skew angle + ! from a cross product of the disk-averaged wind with the disk normal, which is + ! the pseudovector pattern that carries a sign at every other module boundary + ! here, and the curled-wake model encodes a swirl direction of its own. Neither + ! has been measured. See Phase 6 in the plan. + if (p%FarmIntegration) CALL SetErrStat( ErrID_Fatal, 'MirrorRotor is not yet supported with FAST.Farm.', ErrStat, ErrMsg, RoutineName ) end if end if diff --git a/reg_tests/otherTests/run_guards.sh b/reg_tests/otherTests/run_guards.sh index 6acc20b884..ea5ea2b08d 100755 --- a/reg_tests/otherTests/run_guards.sh +++ b/reg_tests/otherTests/run_guards.sh @@ -138,10 +138,12 @@ mkdir -p "$FG" ln -sfn "$FSRC/WAT_MannBoxDB" "$FG/WAT_MannBoxDB" ln -sfn "$FSRC/5MW_Baseline" "$FG/5MW_Baseline" +MIRROR_MSG="MirrorRotor is not yet supported with FAST.Farm." NROTOR_MSG="Only one rotor per OpenFAST instance is supported with FAST.Farm." # Control: one rotor, not mirrored. Neither guard may fire, and it must run. mkfarm farm_control +runfarm farm_control "$MIRROR_MSG" no runfarm farm_control "$NROTOR_MSG" no runfarm farm_control "FAST.Farm terminated normally." yes @@ -164,3 +166,12 @@ awk '/^---------------------- OUTPUT/ && !ins { && mv "$FG/farm_multirotor/.tmp" "$FG/farm_multirotor/FFTest_WT1.fst" runfarm farm_multirotor "$NROTOR_MSG" yes +# A mirrored turbine in a farm. The mirror is confined to its own OpenFAST +# instance and the blade surfaces do render correctly, but the wake coupling has +# never been measured: FWrap_CalcOutput builds the skew angle from a cross +# product of the disk-averaged wind with the disk normal, which is the +# pseudovector pattern that carries a sign at every other module boundary here. +# Until that is checked the combination is refused rather than run quietly. +mkfarm farm_mirror +sed -i -E 's/^([[:space:]]*)F([[:space:]]+MirrorRotor)/\1 True\2/' "$FG/farm_mirror/FFTest_WT1.fst" +runfarm farm_mirror "$MIRROR_MSG" yes From 1c6af942bd87270723f05bcfa3dfa4a45dcc0a92 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Tue, 25 Aug 2026 17:26:50 -0600 Subject: [PATCH 58/66] Generate the per-channel mirror sign map into the documentation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `sign_map.yaml` has been an unbuilt cross-cutting deliverable since the plan was written. The reason it stayed unbuilt was sound: emit_sign_table.py measures the map on every run rather than storing it, and a stored map is one more artefact that can drift away from what the code actually does. Generating it keeps that property. `emit_sign_table.py --emit-map` writes both the YAML and a rendered reStructuredText page from the same measurement, each carrying a header saying it is generated and giving the command to regenerate it. Nothing is hand-maintained, so nothing can quietly disagree with the code. 1203 channels, sorted alphabetically, each recording its measured behaviour and which registered pairs it was observed in: 686 identical, 328 sign-flipped, one mirrored angle, 55 always below the noise floor and 133 mooring channels set aside because their pairing is layout-specific. None unresolved. The grouped, prose form in mirror_rotor.rst remains the better place to start reading and is cross-linked both ways; this page is for looking a single channel up, and the YAML for anything that wants the map as data. Both carry the same caveat as the grouped table: they record how two runs of a symmetric comparison relate to each other, not a claim that these channels change sign whenever the flag is set. The "?" behaviour key is quoted in the YAML because a bare question mark is a YAML indicator character. The documentation could not be built here to confirm rendering — Sphinx 5.3.0 fails to import under Python 3.13, which removed imghdr — so the page was checked structurally instead: 1203 well-formed table rows, correct title underline, and only directives already used elsewhere in this documentation set. Co-authored-by: Claude Opus 5 --- docs/source/user/glue-code/index.rst | 1 + docs/source/user/glue-code/mirror_rotor.rst | 6 + .../user/glue-code/mirror_rotor_sign_map.rst | 3658 +++++++++++++++++ .../user/glue-code/mirror_rotor_sign_map.yaml | 1220 ++++++ reg_tests/otherTests/emit_sign_table.py | 129 + 5 files changed, 5014 insertions(+) create mode 100644 docs/source/user/glue-code/mirror_rotor_sign_map.rst create mode 100644 docs/source/user/glue-code/mirror_rotor_sign_map.yaml diff --git a/docs/source/user/glue-code/index.rst b/docs/source/user/glue-code/index.rst index 3186107aff..7e7f81c2b9 100644 --- a/docs/source/user/glue-code/index.rst +++ b/docs/source/user/glue-code/index.rst @@ -16,4 +16,5 @@ the glue code from a user and module-developer perspective. modglue solver mirror_rotor + mirror_rotor_sign_map linearization diff --git a/docs/source/user/glue-code/mirror_rotor.rst b/docs/source/user/glue-code/mirror_rotor.rst index c1607ba358..2fbf82e1d6 100644 --- a/docs/source/user/glue-code/mirror_rotor.rst +++ b/docs/source/user/glue-code/mirror_rotor.rst @@ -402,6 +402,12 @@ and one mirrored angle, with a further 55 below the noise floor in every case an 133 mooring channels set aside because their pairing is layout-specific. No channel is unresolved. +The grouped form above is the one to read. The complete per-channel map, listing +all 1203 channels alphabetically with the pairs each was measured in, is at +:ref:`glue-code-mirror-rotor-sign-map`; the same data is available as +``mirror_rotor_sign_map.yaml`` for anything that wants to consume it. Both are +generated by the same measurement and neither should be edited by hand. + .. _glue-code-mirror-rotor-control: diff --git a/docs/source/user/glue-code/mirror_rotor_sign_map.rst b/docs/source/user/glue-code/mirror_rotor_sign_map.rst new file mode 100644 index 0000000000..73d3151d10 --- /dev/null +++ b/docs/source/user/glue-code/mirror_rotor_sign_map.rst @@ -0,0 +1,3658 @@ +.. _glue-code-mirror-rotor-sign-map: + +Mirror-rotor sign map +===================== + +.. warning:: + This page is **generated**. Do not edit it by hand; regenerate it with + + .. code-block:: bash + + python3 reg_tests/otherTests/emit_sign_table.py --tol 0.005 --emit-map + +Every entry below is **measured**, not asserted. Each registered +clockwise/mirrored pair is run and every output channel is compared against its +counterpart, so this records behaviour that is observed rather than behaviour +expected from reading the source. A channel seen in more than one pair must +agree across them; a disagreement is reported rather than silently resolved. + +The grouped, prose form of the same information is in +:ref:`glue-code-mirror-rotor-verification`, which is the better place to start. +This page exists for looking a single channel up, and for anything that wants to +consume the map as data -- see ``mirror_rotor_sign_map.yaml`` beside this file. + +**Read it correctly.** This records how the two runs of a *symmetric* comparison +relate to each other, which is how the implementation is verified. It is **not** +a claim that these channels change sign whenever the flag is set: in an ordinary +simulation the tower, support structure and inflow are not mirrored, so a +quantity such as ``TwrBsMxt`` is simply the response of an unchanged structure to +a counter-clockwise rotor. + +Blade 1 lies on the mirror plane and blades 2 and 3 exchange, so a mirrored +blade 2 is compared against the clockwise blade 3. Mooring channels are set +aside because which line pairs with which depends on the layout. + +Measured at a relative tolerance of ``0.005`` with a noise floor of ``1e-08``, across 1203 channels. + +* **identical** (686) -- v' = v +* **sign-flipped** (328) -- v' = -v +* **mirrored angle** (1) -- v' = -v, wrapped +* **below the noise floor** (55) -- indistinguishable from zero everywhere +* **set aside** (133) -- mooring, pairing is layout-specific + +.. list-table:: + :header-rows: 1 + :widths: 30 25 45 + + * - Channel + - Behaviour + - Measured in + * - ``AB1N001Alpha`` + - identical + - AeroDyn nodal outputs, OLAF free wake + * - ``AB1N001AxInd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N001Cd`` + - identical + - AeroDyn nodal outputs, OLAF free wake + * - ``AB1N001Cl`` + - identical + - AeroDyn nodal outputs, OLAF free wake + * - ``AB1N001Cm`` + - sign-flipped + - AeroDyn nodal outputs, OLAF free wake + * - ``AB1N001Cn`` + - identical + - AeroDyn nodal outputs, OLAF free wake + * - ``AB1N001Ct`` + - sign-flipped + - AeroDyn nodal outputs, OLAF free wake + * - ``AB1N001Cx`` + - identical + - AeroDyn nodal outputs, OLAF free wake + * - ``AB1N001Cy`` + - sign-flipped + - AeroDyn nodal outputs, OLAF free wake + * - ``AB1N001Fd`` + - identical + - AeroDyn nodal outputs, OLAF free wake + * - ``AB1N001Fl`` + - identical + - AeroDyn nodal outputs, OLAF free wake + * - ``AB1N001Fn`` + - identical + - AeroDyn nodal outputs, OLAF free wake + * - ``AB1N001Ft`` + - sign-flipped + - AeroDyn nodal outputs, OLAF free wake + * - ``AB1N001Fx`` + - below the noise floor + - AeroDyn nodal outputs + * - ``AB1N001Fy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N001Gam`` + - identical + - AeroDyn nodal outputs, OLAF free wake + * - ``AB1N001Mm`` + - below the noise floor + - AeroDyn nodal outputs + * - ``AB1N001Phi`` + - identical + - AeroDyn nodal outputs, OLAF free wake + * - ``AB1N001STVx`` + - below the noise floor + - OLAF free wake + * - ``AB1N001STVy`` + - sign-flipped + - AeroDyn nodal outputs, OLAF free wake + * - ``AB1N001STVz`` + - below the noise floor + - OLAF free wake + * - ``AB1N001Theta`` + - identical + - AeroDyn nodal outputs + * - ``AB1N001TnInd`` + - below the noise floor + - AeroDyn nodal outputs + * - ``AB1N001VDisx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N001Vindx`` + - identical + - AeroDyn nodal outputs, OLAF free wake + * - ``AB1N001Vindy`` + - sign-flipped + - AeroDyn nodal outputs, OLAF free wake + * - ``AB1N001VRel`` + - identical + - OLAF free wake + * - ``AB1N001Vrel`` + - identical + - AeroDyn nodal outputs + * - ``AB1N001VUndx`` + - identical + - AeroDyn nodal outputs, OLAF free wake + * - ``AB1N001VUndy`` + - sign-flipped + - OLAF free wake + * - ``AB1N001VUndz`` + - identical + - OLAF free wake + * - ``AB1N002Alpha`` + - identical + - AeroDyn nodal outputs, OLAF free wake + * - ``AB1N002AxInd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N002Cd`` + - identical + - AeroDyn nodal outputs, OLAF free wake + * - ``AB1N002Cl`` + - identical + - AeroDyn nodal outputs, OLAF free wake + * - ``AB1N002Cm`` + - sign-flipped + - AeroDyn nodal outputs, OLAF free wake + * - ``AB1N002Cn`` + - identical + - AeroDyn nodal outputs, OLAF free wake + * - ``AB1N002Ct`` + - sign-flipped + - AeroDyn nodal outputs, OLAF free wake + * - ``AB1N002Cx`` + - identical + - AeroDyn nodal outputs, OLAF free wake + * - ``AB1N002Cy`` + - sign-flipped + - AeroDyn nodal outputs, OLAF free wake + * - ``AB1N002Fd`` + - identical + - AeroDyn nodal outputs, OLAF free wake + * - ``AB1N002Fl`` + - identical + - AeroDyn nodal outputs, OLAF free wake + * - ``AB1N002Fn`` + - identical + - AeroDyn nodal outputs, OLAF free wake + * - ``AB1N002Ft`` + - sign-flipped + - AeroDyn nodal outputs, OLAF free wake + * - ``AB1N002Fx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N002Fy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N002Gam`` + - identical + - AeroDyn nodal outputs, OLAF free wake + * - ``AB1N002Mm`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N002Phi`` + - identical + - AeroDyn nodal outputs, OLAF free wake + * - ``AB1N002STVx`` + - below the noise floor + - OLAF free wake + * - ``AB1N002STVy`` + - sign-flipped + - AeroDyn nodal outputs, OLAF free wake + * - ``AB1N002STVz`` + - below the noise floor + - OLAF free wake + * - ``AB1N002Theta`` + - identical + - AeroDyn nodal outputs + * - ``AB1N002TnInd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N002VDisx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N002Vindx`` + - identical + - AeroDyn nodal outputs, OLAF free wake + * - ``AB1N002Vindy`` + - sign-flipped + - AeroDyn nodal outputs, OLAF free wake + * - ``AB1N002VRel`` + - identical + - OLAF free wake + * - ``AB1N002Vrel`` + - identical + - AeroDyn nodal outputs + * - ``AB1N002VUndx`` + - identical + - AeroDyn nodal outputs, OLAF free wake + * - ``AB1N002VUndy`` + - sign-flipped + - OLAF free wake + * - ``AB1N002VUndz`` + - identical + - OLAF free wake + * - ``AB1N003Alpha`` + - identical + - AeroDyn nodal outputs + * - ``AB1N003AxInd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N003Cd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N003Cl`` + - identical + - AeroDyn nodal outputs + * - ``AB1N003Cm`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N003Cn`` + - identical + - AeroDyn nodal outputs + * - ``AB1N003Ct`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N003Cx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N003Cy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N003Fd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N003Fl`` + - identical + - AeroDyn nodal outputs + * - ``AB1N003Fn`` + - identical + - AeroDyn nodal outputs + * - ``AB1N003Ft`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N003Fx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N003Fy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N003Gam`` + - identical + - AeroDyn nodal outputs + * - ``AB1N003Mm`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N003Phi`` + - identical + - AeroDyn nodal outputs + * - ``AB1N003STVy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N003Theta`` + - identical + - AeroDyn nodal outputs + * - ``AB1N003TnInd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N003VDisx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N003Vindx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N003Vindy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N003Vrel`` + - identical + - AeroDyn nodal outputs + * - ``AB1N003VUndx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N004Alpha`` + - identical + - AeroDyn nodal outputs + * - ``AB1N004AxInd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N004Cd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N004Cl`` + - identical + - AeroDyn nodal outputs + * - ``AB1N004Cm`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N004Cn`` + - identical + - AeroDyn nodal outputs + * - ``AB1N004Ct`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N004Cx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N004Cy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N004Fd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N004Fl`` + - identical + - AeroDyn nodal outputs + * - ``AB1N004Fn`` + - identical + - AeroDyn nodal outputs + * - ``AB1N004Ft`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N004Fx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N004Fy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N004Gam`` + - identical + - AeroDyn nodal outputs + * - ``AB1N004Mm`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N004Phi`` + - identical + - AeroDyn nodal outputs + * - ``AB1N004STVy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N004Theta`` + - identical + - AeroDyn nodal outputs + * - ``AB1N004TnInd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N004VDisx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N004Vindx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N004Vindy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N004Vrel`` + - identical + - AeroDyn nodal outputs + * - ``AB1N004VUndx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N005Alpha`` + - identical + - AeroDyn nodal outputs + * - ``AB1N005AxInd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N005Cd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N005Cl`` + - identical + - AeroDyn nodal outputs + * - ``AB1N005Cm`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N005Cn`` + - identical + - AeroDyn nodal outputs + * - ``AB1N005Ct`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N005Cx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N005Cy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N005Fd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N005Fl`` + - identical + - AeroDyn nodal outputs + * - ``AB1N005Fn`` + - identical + - AeroDyn nodal outputs + * - ``AB1N005Ft`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N005Fx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N005Fy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N005Gam`` + - identical + - AeroDyn nodal outputs + * - ``AB1N005Mm`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N005Phi`` + - identical + - AeroDyn nodal outputs + * - ``AB1N005STVy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N005Theta`` + - identical + - AeroDyn nodal outputs + * - ``AB1N005TnInd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N005VDisx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N005Vindx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N005Vindy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N005Vrel`` + - identical + - AeroDyn nodal outputs + * - ``AB1N005VUndx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N006Alpha`` + - identical + - AeroDyn nodal outputs + * - ``AB1N006AxInd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N006Cd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N006Cl`` + - identical + - AeroDyn nodal outputs + * - ``AB1N006Cm`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N006Cn`` + - identical + - AeroDyn nodal outputs + * - ``AB1N006Ct`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N006Cx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N006Cy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N006Fd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N006Fl`` + - identical + - AeroDyn nodal outputs + * - ``AB1N006Fn`` + - identical + - AeroDyn nodal outputs + * - ``AB1N006Ft`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N006Fx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N006Fy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N006Gam`` + - identical + - AeroDyn nodal outputs + * - ``AB1N006Mm`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N006Phi`` + - identical + - AeroDyn nodal outputs + * - ``AB1N006STVy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N006Theta`` + - identical + - AeroDyn nodal outputs + * - ``AB1N006TnInd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N006VDisx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N006Vindx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N006Vindy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N006Vrel`` + - identical + - AeroDyn nodal outputs + * - ``AB1N006VUndx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N007Alpha`` + - identical + - AeroDyn nodal outputs + * - ``AB1N007AxInd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N007Cd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N007Cl`` + - identical + - AeroDyn nodal outputs + * - ``AB1N007Cm`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N007Cn`` + - identical + - AeroDyn nodal outputs + * - ``AB1N007Ct`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N007Cx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N007Cy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N007Fd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N007Fl`` + - identical + - AeroDyn nodal outputs + * - ``AB1N007Fn`` + - identical + - AeroDyn nodal outputs + * - ``AB1N007Ft`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N007Fx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N007Fy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N007Gam`` + - identical + - AeroDyn nodal outputs + * - ``AB1N007Mm`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N007Phi`` + - identical + - AeroDyn nodal outputs + * - ``AB1N007STVy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N007Theta`` + - identical + - AeroDyn nodal outputs + * - ``AB1N007TnInd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N007VDisx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N007Vindx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N007Vindy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N007Vrel`` + - identical + - AeroDyn nodal outputs + * - ``AB1N007VUndx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N008Alpha`` + - identical + - AeroDyn nodal outputs + * - ``AB1N008AxInd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N008Cd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N008Cl`` + - identical + - AeroDyn nodal outputs + * - ``AB1N008Cm`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N008Cn`` + - identical + - AeroDyn nodal outputs + * - ``AB1N008Ct`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N008Cx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N008Cy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N008Fd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N008Fl`` + - identical + - AeroDyn nodal outputs + * - ``AB1N008Fn`` + - identical + - AeroDyn nodal outputs + * - ``AB1N008Ft`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N008Fx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N008Fy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N008Gam`` + - identical + - AeroDyn nodal outputs + * - ``AB1N008Mm`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N008Phi`` + - identical + - AeroDyn nodal outputs + * - ``AB1N008STVy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N008Theta`` + - identical + - AeroDyn nodal outputs + * - ``AB1N008TnInd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N008VDisx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N008Vindx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N008Vindy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N008Vrel`` + - identical + - AeroDyn nodal outputs + * - ``AB1N008VUndx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N009Alpha`` + - identical + - AeroDyn nodal outputs + * - ``AB1N009AxInd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N009Cd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N009Cl`` + - identical + - AeroDyn nodal outputs + * - ``AB1N009Cm`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N009Cn`` + - identical + - AeroDyn nodal outputs + * - ``AB1N009Ct`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N009Cx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N009Cy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N009Fd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N009Fl`` + - identical + - AeroDyn nodal outputs + * - ``AB1N009Fn`` + - identical + - AeroDyn nodal outputs + * - ``AB1N009Ft`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N009Fx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N009Fy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N009Gam`` + - identical + - AeroDyn nodal outputs + * - ``AB1N009Mm`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N009Phi`` + - identical + - AeroDyn nodal outputs + * - ``AB1N009STVy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N009Theta`` + - identical + - AeroDyn nodal outputs + * - ``AB1N009TnInd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N009VDisx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N009Vindx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N009Vindy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N009Vrel`` + - identical + - AeroDyn nodal outputs + * - ``AB1N009VUndx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N010Alpha`` + - identical + - AeroDyn nodal outputs + * - ``AB1N010AxInd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N010Cd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N010Cl`` + - identical + - AeroDyn nodal outputs + * - ``AB1N010Cm`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N010Cn`` + - identical + - AeroDyn nodal outputs + * - ``AB1N010Ct`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N010Cx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N010Cy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N010Fd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N010Fl`` + - identical + - AeroDyn nodal outputs + * - ``AB1N010Fn`` + - identical + - AeroDyn nodal outputs + * - ``AB1N010Ft`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N010Fx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N010Fy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N010Gam`` + - identical + - AeroDyn nodal outputs + * - ``AB1N010Mm`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N010Phi`` + - identical + - AeroDyn nodal outputs + * - ``AB1N010STVy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N010Theta`` + - identical + - AeroDyn nodal outputs + * - ``AB1N010TnInd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N010VDisx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N010Vindx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N010Vindy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N010Vrel`` + - identical + - AeroDyn nodal outputs + * - ``AB1N010VUndx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N011Alpha`` + - identical + - AeroDyn nodal outputs + * - ``AB1N011AxInd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N011Cd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N011Cl`` + - identical + - AeroDyn nodal outputs + * - ``AB1N011Cm`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N011Cn`` + - identical + - AeroDyn nodal outputs + * - ``AB1N011Ct`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N011Cx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N011Cy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N011Fd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N011Fl`` + - identical + - AeroDyn nodal outputs + * - ``AB1N011Fn`` + - identical + - AeroDyn nodal outputs + * - ``AB1N011Ft`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N011Fx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N011Fy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N011Gam`` + - identical + - AeroDyn nodal outputs + * - ``AB1N011Mm`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N011Phi`` + - identical + - AeroDyn nodal outputs + * - ``AB1N011STVy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N011Theta`` + - identical + - AeroDyn nodal outputs + * - ``AB1N011TnInd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N011VDisx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N011Vindx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N011Vindy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N011Vrel`` + - identical + - AeroDyn nodal outputs + * - ``AB1N011VUndx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N012Alpha`` + - identical + - AeroDyn nodal outputs + * - ``AB1N012AxInd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N012Cd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N012Cl`` + - identical + - AeroDyn nodal outputs + * - ``AB1N012Cm`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N012Cn`` + - identical + - AeroDyn nodal outputs + * - ``AB1N012Ct`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N012Cx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N012Cy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N012Fd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N012Fl`` + - identical + - AeroDyn nodal outputs + * - ``AB1N012Fn`` + - identical + - AeroDyn nodal outputs + * - ``AB1N012Ft`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N012Fx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N012Fy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N012Gam`` + - identical + - AeroDyn nodal outputs + * - ``AB1N012Mm`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N012Phi`` + - identical + - AeroDyn nodal outputs + * - ``AB1N012STVy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N012Theta`` + - identical + - AeroDyn nodal outputs + * - ``AB1N012TnInd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N012VDisx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N012Vindx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N012Vindy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N012Vrel`` + - identical + - AeroDyn nodal outputs + * - ``AB1N012VUndx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N013Alpha`` + - identical + - AeroDyn nodal outputs + * - ``AB1N013AxInd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N013Cd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N013Cl`` + - identical + - AeroDyn nodal outputs + * - ``AB1N013Cm`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N013Cn`` + - identical + - AeroDyn nodal outputs + * - ``AB1N013Ct`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N013Cx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N013Cy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N013Fd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N013Fl`` + - identical + - AeroDyn nodal outputs + * - ``AB1N013Fn`` + - identical + - AeroDyn nodal outputs + * - ``AB1N013Ft`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N013Fx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N013Fy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N013Gam`` + - identical + - AeroDyn nodal outputs + * - ``AB1N013Mm`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N013Phi`` + - identical + - AeroDyn nodal outputs + * - ``AB1N013STVy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N013Theta`` + - identical + - AeroDyn nodal outputs + * - ``AB1N013TnInd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N013VDisx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N013Vindx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N013Vindy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N013Vrel`` + - identical + - AeroDyn nodal outputs + * - ``AB1N013VUndx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N014Alpha`` + - identical + - AeroDyn nodal outputs + * - ``AB1N014AxInd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N014Cd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N014Cl`` + - identical + - AeroDyn nodal outputs + * - ``AB1N014Cm`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N014Cn`` + - identical + - AeroDyn nodal outputs + * - ``AB1N014Ct`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N014Cx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N014Cy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N014Fd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N014Fl`` + - identical + - AeroDyn nodal outputs + * - ``AB1N014Fn`` + - identical + - AeroDyn nodal outputs + * - ``AB1N014Ft`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N014Fx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N014Fy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N014Gam`` + - identical + - AeroDyn nodal outputs + * - ``AB1N014Mm`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N014Phi`` + - identical + - AeroDyn nodal outputs + * - ``AB1N014STVy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N014Theta`` + - identical + - AeroDyn nodal outputs + * - ``AB1N014TnInd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N014VDisx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N014Vindx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N014Vindy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N014Vrel`` + - identical + - AeroDyn nodal outputs + * - ``AB1N014VUndx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N015Alpha`` + - identical + - AeroDyn nodal outputs + * - ``AB1N015AxInd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N015Cd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N015Cl`` + - identical + - AeroDyn nodal outputs + * - ``AB1N015Cm`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N015Cn`` + - identical + - AeroDyn nodal outputs + * - ``AB1N015Ct`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N015Cx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N015Cy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N015Fd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N015Fl`` + - identical + - AeroDyn nodal outputs + * - ``AB1N015Fn`` + - identical + - AeroDyn nodal outputs + * - ``AB1N015Ft`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N015Fx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N015Fy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N015Gam`` + - identical + - AeroDyn nodal outputs + * - ``AB1N015Mm`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N015Phi`` + - identical + - AeroDyn nodal outputs + * - ``AB1N015STVy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N015Theta`` + - identical + - AeroDyn nodal outputs + * - ``AB1N015TnInd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N015VDisx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N015Vindx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N015Vindy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N015Vrel`` + - identical + - AeroDyn nodal outputs + * - ``AB1N015VUndx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N016Alpha`` + - identical + - AeroDyn nodal outputs + * - ``AB1N016AxInd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N016Cd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N016Cl`` + - identical + - AeroDyn nodal outputs + * - ``AB1N016Cm`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N016Cn`` + - identical + - AeroDyn nodal outputs + * - ``AB1N016Ct`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N016Cx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N016Cy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N016Fd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N016Fl`` + - identical + - AeroDyn nodal outputs + * - ``AB1N016Fn`` + - identical + - AeroDyn nodal outputs + * - ``AB1N016Ft`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N016Fx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N016Fy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N016Gam`` + - identical + - AeroDyn nodal outputs + * - ``AB1N016Mm`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N016Phi`` + - identical + - AeroDyn nodal outputs + * - ``AB1N016STVy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N016Theta`` + - identical + - AeroDyn nodal outputs + * - ``AB1N016TnInd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N016VDisx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N016Vindx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N016Vindy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N016Vrel`` + - identical + - AeroDyn nodal outputs + * - ``AB1N016VUndx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N017Alpha`` + - identical + - AeroDyn nodal outputs + * - ``AB1N017AxInd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N017Cd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N017Cl`` + - identical + - AeroDyn nodal outputs + * - ``AB1N017Cm`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N017Cn`` + - identical + - AeroDyn nodal outputs + * - ``AB1N017Ct`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N017Cx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N017Cy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N017Fd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N017Fl`` + - identical + - AeroDyn nodal outputs + * - ``AB1N017Fn`` + - identical + - AeroDyn nodal outputs + * - ``AB1N017Ft`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N017Fx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N017Fy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N017Gam`` + - identical + - AeroDyn nodal outputs + * - ``AB1N017Mm`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N017Phi`` + - identical + - AeroDyn nodal outputs + * - ``AB1N017STVy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N017Theta`` + - identical + - AeroDyn nodal outputs + * - ``AB1N017TnInd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N017VDisx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N017Vindx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N017Vindy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N017Vrel`` + - identical + - AeroDyn nodal outputs + * - ``AB1N017VUndx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N018Alpha`` + - identical + - AeroDyn nodal outputs + * - ``AB1N018AxInd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N018Cd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N018Cl`` + - identical + - AeroDyn nodal outputs + * - ``AB1N018Cm`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N018Cn`` + - identical + - AeroDyn nodal outputs + * - ``AB1N018Ct`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N018Cx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N018Cy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N018Fd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N018Fl`` + - identical + - AeroDyn nodal outputs + * - ``AB1N018Fn`` + - identical + - AeroDyn nodal outputs + * - ``AB1N018Ft`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N018Fx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N018Fy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N018Gam`` + - identical + - AeroDyn nodal outputs + * - ``AB1N018Mm`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N018Phi`` + - identical + - AeroDyn nodal outputs + * - ``AB1N018STVy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N018Theta`` + - identical + - AeroDyn nodal outputs + * - ``AB1N018TnInd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N018VDisx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N018Vindx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N018Vindy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N018Vrel`` + - identical + - AeroDyn nodal outputs + * - ``AB1N018VUndx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N019Alpha`` + - identical + - AeroDyn nodal outputs + * - ``AB1N019AxInd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N019Cd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N019Cl`` + - identical + - AeroDyn nodal outputs + * - ``AB1N019Cm`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N019Cn`` + - identical + - AeroDyn nodal outputs + * - ``AB1N019Ct`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N019Cx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N019Cy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N019Fd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N019Fl`` + - identical + - AeroDyn nodal outputs + * - ``AB1N019Fn`` + - identical + - AeroDyn nodal outputs + * - ``AB1N019Ft`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N019Fx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N019Fy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N019Gam`` + - identical + - AeroDyn nodal outputs + * - ``AB1N019Mm`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N019Phi`` + - identical + - AeroDyn nodal outputs + * - ``AB1N019STVy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N019Theta`` + - identical + - AeroDyn nodal outputs + * - ``AB1N019TnInd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N019VDisx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N019Vindx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N019Vindy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N019Vrel`` + - identical + - AeroDyn nodal outputs + * - ``AB1N019VUndx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N020Alpha`` + - identical + - AeroDyn nodal outputs + * - ``AB1N020AxInd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N020Cd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N020Cl`` + - identical + - AeroDyn nodal outputs + * - ``AB1N020Cm`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N020Cn`` + - identical + - AeroDyn nodal outputs + * - ``AB1N020Ct`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N020Cx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N020Cy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N020Fd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N020Fl`` + - identical + - AeroDyn nodal outputs + * - ``AB1N020Fn`` + - identical + - AeroDyn nodal outputs + * - ``AB1N020Ft`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N020Fx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N020Fy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N020Gam`` + - identical + - AeroDyn nodal outputs + * - ``AB1N020Mm`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N020Phi`` + - identical + - AeroDyn nodal outputs + * - ``AB1N020STVy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N020Theta`` + - identical + - AeroDyn nodal outputs + * - ``AB1N020TnInd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N020VDisx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N020Vindx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N020Vindy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N020Vrel`` + - identical + - AeroDyn nodal outputs + * - ``AB1N020VUndx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N021Alpha`` + - identical + - AeroDyn nodal outputs + * - ``AB1N021AxInd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N021Cd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N021Cl`` + - identical + - AeroDyn nodal outputs + * - ``AB1N021Cm`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N021Cn`` + - identical + - AeroDyn nodal outputs + * - ``AB1N021Ct`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N021Cx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N021Cy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N021Fd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N021Fl`` + - identical + - AeroDyn nodal outputs + * - ``AB1N021Fn`` + - identical + - AeroDyn nodal outputs + * - ``AB1N021Ft`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N021Fx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N021Fy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N021Gam`` + - identical + - AeroDyn nodal outputs + * - ``AB1N021Mm`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N021Phi`` + - identical + - AeroDyn nodal outputs + * - ``AB1N021STVy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N021Theta`` + - identical + - AeroDyn nodal outputs + * - ``AB1N021TnInd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N021VDisx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N021Vindx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N021Vindy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N021Vrel`` + - identical + - AeroDyn nodal outputs + * - ``AB1N021VUndx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N022Alpha`` + - identical + - AeroDyn nodal outputs + * - ``AB1N022AxInd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N022Cd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N022Cl`` + - identical + - AeroDyn nodal outputs + * - ``AB1N022Cm`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N022Cn`` + - identical + - AeroDyn nodal outputs + * - ``AB1N022Ct`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N022Cx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N022Cy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N022Fd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N022Fl`` + - identical + - AeroDyn nodal outputs + * - ``AB1N022Fn`` + - identical + - AeroDyn nodal outputs + * - ``AB1N022Ft`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N022Fx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N022Fy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N022Gam`` + - identical + - AeroDyn nodal outputs + * - ``AB1N022Mm`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N022Phi`` + - identical + - AeroDyn nodal outputs + * - ``AB1N022STVy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N022Theta`` + - identical + - AeroDyn nodal outputs + * - ``AB1N022TnInd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N022VDisx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N022Vindx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N022Vindy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N022Vrel`` + - identical + - AeroDyn nodal outputs + * - ``AB1N022VUndx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N023Alpha`` + - identical + - AeroDyn nodal outputs + * - ``AB1N023AxInd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N023Cd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N023Cl`` + - identical + - AeroDyn nodal outputs + * - ``AB1N023Cm`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N023Cn`` + - identical + - AeroDyn nodal outputs + * - ``AB1N023Ct`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N023Cx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N023Cy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N023Fd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N023Fl`` + - identical + - AeroDyn nodal outputs + * - ``AB1N023Fn`` + - identical + - AeroDyn nodal outputs + * - ``AB1N023Ft`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N023Fx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N023Fy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N023Gam`` + - identical + - AeroDyn nodal outputs + * - ``AB1N023Mm`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N023Phi`` + - identical + - AeroDyn nodal outputs + * - ``AB1N023STVy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N023Theta`` + - identical + - AeroDyn nodal outputs + * - ``AB1N023TnInd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N023VDisx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N023Vindx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N023Vindy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N023Vrel`` + - identical + - AeroDyn nodal outputs + * - ``AB1N023VUndx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N024Alpha`` + - identical + - AeroDyn nodal outputs + * - ``AB1N024AxInd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N024Cd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N024Cl`` + - identical + - AeroDyn nodal outputs + * - ``AB1N024Cm`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N024Cn`` + - identical + - AeroDyn nodal outputs + * - ``AB1N024Ct`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N024Cx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N024Cy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N024Fd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N024Fl`` + - identical + - AeroDyn nodal outputs + * - ``AB1N024Fn`` + - identical + - AeroDyn nodal outputs + * - ``AB1N024Ft`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N024Fx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N024Fy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N024Gam`` + - identical + - AeroDyn nodal outputs + * - ``AB1N024Mm`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N024Phi`` + - identical + - AeroDyn nodal outputs + * - ``AB1N024STVy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N024Theta`` + - identical + - AeroDyn nodal outputs + * - ``AB1N024TnInd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N024VDisx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N024Vindx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N024Vindy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N024Vrel`` + - identical + - AeroDyn nodal outputs + * - ``AB1N024VUndx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N025Alpha`` + - identical + - AeroDyn nodal outputs + * - ``AB1N025AxInd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N025Cd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N025Cl`` + - identical + - AeroDyn nodal outputs + * - ``AB1N025Cm`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N025Cn`` + - identical + - AeroDyn nodal outputs + * - ``AB1N025Ct`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N025Cx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N025Cy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N025Fd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N025Fl`` + - identical + - AeroDyn nodal outputs + * - ``AB1N025Fn`` + - identical + - AeroDyn nodal outputs + * - ``AB1N025Ft`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N025Fx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N025Fy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N025Gam`` + - identical + - AeroDyn nodal outputs + * - ``AB1N025Mm`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N025Phi`` + - identical + - AeroDyn nodal outputs + * - ``AB1N025STVy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N025Theta`` + - identical + - AeroDyn nodal outputs + * - ``AB1N025TnInd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N025VDisx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N025Vindx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N025Vindy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N025Vrel`` + - identical + - AeroDyn nodal outputs + * - ``AB1N025VUndx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N026Alpha`` + - identical + - AeroDyn nodal outputs + * - ``AB1N026AxInd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N026Cd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N026Cl`` + - identical + - AeroDyn nodal outputs + * - ``AB1N026Cm`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N026Cn`` + - identical + - AeroDyn nodal outputs + * - ``AB1N026Ct`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N026Cx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N026Cy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N026Fd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N026Fl`` + - identical + - AeroDyn nodal outputs + * - ``AB1N026Fn`` + - identical + - AeroDyn nodal outputs + * - ``AB1N026Ft`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N026Fx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N026Fy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N026Gam`` + - identical + - AeroDyn nodal outputs + * - ``AB1N026Mm`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N026Phi`` + - identical + - AeroDyn nodal outputs + * - ``AB1N026STVy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N026Theta`` + - identical + - AeroDyn nodal outputs + * - ``AB1N026TnInd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N026VDisx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N026Vindx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N026Vindy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N026Vrel`` + - identical + - AeroDyn nodal outputs + * - ``AB1N026VUndx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N027Alpha`` + - identical + - AeroDyn nodal outputs + * - ``AB1N027AxInd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N027Cd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N027Cl`` + - identical + - AeroDyn nodal outputs + * - ``AB1N027Cm`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N027Cn`` + - identical + - AeroDyn nodal outputs + * - ``AB1N027Ct`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N027Cx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N027Cy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N027Fd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N027Fl`` + - identical + - AeroDyn nodal outputs + * - ``AB1N027Fn`` + - identical + - AeroDyn nodal outputs + * - ``AB1N027Ft`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N027Fx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N027Fy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N027Gam`` + - identical + - AeroDyn nodal outputs + * - ``AB1N027Mm`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N027Phi`` + - identical + - AeroDyn nodal outputs + * - ``AB1N027STVy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N027Theta`` + - identical + - AeroDyn nodal outputs + * - ``AB1N027TnInd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N027VDisx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N027Vindx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N027Vindy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N027Vrel`` + - identical + - AeroDyn nodal outputs + * - ``AB1N027VUndx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N028Alpha`` + - identical + - AeroDyn nodal outputs + * - ``AB1N028AxInd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N028Cd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N028Cl`` + - identical + - AeroDyn nodal outputs + * - ``AB1N028Cm`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N028Cn`` + - identical + - AeroDyn nodal outputs + * - ``AB1N028Ct`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N028Cx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N028Cy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N028Fd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N028Fl`` + - identical + - AeroDyn nodal outputs + * - ``AB1N028Fn`` + - identical + - AeroDyn nodal outputs + * - ``AB1N028Ft`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N028Fx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N028Fy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N028Gam`` + - identical + - AeroDyn nodal outputs + * - ``AB1N028Mm`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N028Phi`` + - identical + - AeroDyn nodal outputs + * - ``AB1N028STVy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N028Theta`` + - identical + - AeroDyn nodal outputs + * - ``AB1N028TnInd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N028VDisx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N028Vindx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N028Vindy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N028Vrel`` + - identical + - AeroDyn nodal outputs + * - ``AB1N028VUndx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N029Alpha`` + - identical + - AeroDyn nodal outputs + * - ``AB1N029AxInd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N029Cd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N029Cl`` + - identical + - AeroDyn nodal outputs + * - ``AB1N029Cm`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N029Cn`` + - identical + - AeroDyn nodal outputs + * - ``AB1N029Ct`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N029Cx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N029Cy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N029Fd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N029Fl`` + - identical + - AeroDyn nodal outputs + * - ``AB1N029Fn`` + - identical + - AeroDyn nodal outputs + * - ``AB1N029Ft`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N029Fx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N029Fy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N029Gam`` + - identical + - AeroDyn nodal outputs + * - ``AB1N029Mm`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N029Phi`` + - identical + - AeroDyn nodal outputs + * - ``AB1N029STVy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N029Theta`` + - identical + - AeroDyn nodal outputs + * - ``AB1N029TnInd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N029VDisx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N029Vindx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N029Vindy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N029Vrel`` + - identical + - AeroDyn nodal outputs + * - ``AB1N029VUndx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N030Alpha`` + - identical + - AeroDyn nodal outputs + * - ``AB1N030AxInd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N030Cd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N030Cl`` + - identical + - AeroDyn nodal outputs + * - ``AB1N030Cm`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N030Cn`` + - identical + - AeroDyn nodal outputs + * - ``AB1N030Ct`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N030Cx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N030Cy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N030Fd`` + - identical + - AeroDyn nodal outputs + * - ``AB1N030Fl`` + - identical + - AeroDyn nodal outputs + * - ``AB1N030Fn`` + - identical + - AeroDyn nodal outputs + * - ``AB1N030Ft`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N030Fx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N030Fy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N030Gam`` + - identical + - AeroDyn nodal outputs + * - ``AB1N030Mm`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N030Phi`` + - below the noise floor + - AeroDyn nodal outputs + * - ``AB1N030STVy`` + - sign-flipped + - AeroDyn nodal outputs + * - ``AB1N030Theta`` + - identical + - AeroDyn nodal outputs + * - ``AB1N030TnInd`` + - below the noise floor + - AeroDyn nodal outputs + * - ``AB1N030VDisx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N030Vindx`` + - identical + - AeroDyn nodal outputs + * - ``AB1N030Vindy`` + - below the noise floor + - AeroDyn nodal outputs + * - ``AB1N030Vrel`` + - identical + - AeroDyn nodal outputs + * - ``AB1N030VUndx`` + - identical + - AeroDyn nodal outputs + * - ``ADCp`` + - identical + - AeroDisk, yawed + * - ``ADCq`` + - identical + - AeroDisk, yawed + * - ``ADCt`` + - identical + - AeroDisk, yawed + * - ``ADFx`` + - identical + - AeroDisk, yawed + * - ``ADFxi`` + - identical + - AeroDisk, yawed + * - ``ADFy`` + - identical + - AeroDisk, yawed + * - ``ADFyi`` + - sign-flipped + - AeroDisk, yawed + * - ``ADFz`` + - identical + - AeroDisk, yawed + * - ``ADFzi`` + - identical + - AeroDisk, yawed + * - ``ADMx`` + - sign-flipped + - AeroDisk, yawed + * - ``ADMxi`` + - sign-flipped + - AeroDisk, yawed + * - ``ADMy`` + - sign-flipped + - AeroDisk, yawed + * - ``ADMyi`` + - identical + - AeroDisk, yawed + * - ``ADMz`` + - sign-flipped + - AeroDisk, yawed + * - ``ADMzi`` + - sign-flipped + - AeroDisk, yawed + * - ``ADPitch`` + - below the noise floor + - AeroDisk, yawed + * - ``ADPower`` + - identical + - AeroDisk, yawed + * - ``ADSkew`` + - identical + - AeroDisk, yawed + * - ``ADSpeed`` + - sign-flipped + - AeroDisk, yawed + * - ``ADSTVx`` + - below the noise floor + - AeroDisk, yawed + * - ``ADSTVxi`` + - below the noise floor + - AeroDisk, yawed + * - ``ADSTVy`` + - below the noise floor + - AeroDisk, yawed + * - ``ADSTVyi`` + - below the noise floor + - AeroDisk, yawed + * - ``ADSTVz`` + - below the noise floor + - AeroDisk, yawed + * - ``ADSTVzi`` + - below the noise floor + - AeroDisk, yawed + * - ``ADTSR`` + - identical + - AeroDisk, yawed + * - ``ADVRel`` + - identical + - AeroDisk, yawed + * - ``ADVWindx`` + - identical + - AeroDisk, yawed + * - ``ADVWindxi`` + - identical + - AeroDisk, yawed + * - ``ADVWindy`` + - identical + - AeroDisk, yawed + * - ``ADVWindyi`` + - below the noise floor + - AeroDisk, yawed + * - ``ADVWindz`` + - below the noise floor + - AeroDisk, yawed + * - ``ADVWindzi`` + - below the noise floor + - AeroDisk, yawed + * - ``ADYawErr`` + - below the noise floor + - AeroDisk, yawed + * - ``ANCHTEN1`` + - set aside, layout-specific + - MHK buoyancy + * - ``ANCHTEN2`` + - set aside, layout-specific + - MHK buoyancy + * - ``ANCHTEN3`` + - set aside, layout-specific + - MHK buoyancy + * - ``ANCHTEN4`` + - set aside, layout-specific + - MHK buoyancy + * - ``Azimuth`` + - identical + - AeroDisk, yawed, AeroDyn nodal outputs, BeamDyn blades, ElastoDyn + AeroDyn, OLAF free wake, Twin-rotor semisubmersible + * - ``B1AeroPwr`` + - identical + - ElastoDyn + AeroDyn + * - ``B1FldFz`` + - identical + - MHK buoyancy + * - ``B1N1Alpha`` + - identical + - BeamDyn blades, ElastoDyn + AeroDyn + * - ``B1N1Cd`` + - identical + - ElastoDyn + AeroDyn + * - ``B1N1Cl`` + - below the noise floor + - ElastoDyn + AeroDyn + * - ``B1N1Cm`` + - below the noise floor + - ElastoDyn + AeroDyn + * - ``B1N1Cn`` + - identical + - ElastoDyn + AeroDyn + * - ``B1N1Ct`` + - sign-flipped + - ElastoDyn + AeroDyn + * - ``B1N1Cx`` + - below the noise floor + - ElastoDyn + AeroDyn + * - ``B1N1Cy`` + - sign-flipped + - ElastoDyn + AeroDyn + * - ``B1N1Fd`` + - identical + - ElastoDyn + AeroDyn + * - ``B1N1Fl`` + - below the noise floor + - ElastoDyn + AeroDyn + * - ``B1N1Fn`` + - identical + - BeamDyn blades, ElastoDyn + AeroDyn + * - ``B1N1Ft`` + - sign-flipped + - BeamDyn blades, ElastoDyn + AeroDyn + * - ``B1N1Fx`` + - below the noise floor + - ElastoDyn + AeroDyn + * - ``B1N1Fy`` + - sign-flipped + - ElastoDyn + AeroDyn + * - ``B1N1Theta`` + - identical + - BeamDyn blades, ElastoDyn + AeroDyn + * - ``B1N1VIndx`` + - identical + - ElastoDyn + AeroDyn + * - ``B1N1VIndy`` + - below the noise floor + - ElastoDyn + AeroDyn + * - ``B1N2Alpha`` + - identical + - BeamDyn blades, ElastoDyn + AeroDyn + * - ``B1N2Cd`` + - identical + - ElastoDyn + AeroDyn + * - ``B1N2Cl`` + - identical + - ElastoDyn + AeroDyn + * - ``B1N2Cm`` + - sign-flipped + - ElastoDyn + AeroDyn + * - ``B1N2Cn`` + - identical + - ElastoDyn + AeroDyn + * - ``B1N2Ct`` + - sign-flipped + - ElastoDyn + AeroDyn + * - ``B1N2Cx`` + - identical + - ElastoDyn + AeroDyn + * - ``B1N2Cy`` + - sign-flipped + - ElastoDyn + AeroDyn + * - ``B1N2Fd`` + - identical + - ElastoDyn + AeroDyn + * - ``B1N2Fl`` + - identical + - ElastoDyn + AeroDyn + * - ``B1N2Fn`` + - identical + - BeamDyn blades, ElastoDyn + AeroDyn + * - ``B1N2Ft`` + - sign-flipped + - BeamDyn blades, ElastoDyn + AeroDyn + * - ``B1N2Fx`` + - identical + - ElastoDyn + AeroDyn + * - ``B1N2Fy`` + - sign-flipped + - ElastoDyn + AeroDyn + * - ``B1N2Mbn`` + - sign-flipped + - MHK buoyancy + * - ``B1N2SgCav`` + - identical + - MHK buoyancy + * - ``B1N2Theta`` + - identical + - BeamDyn blades, ElastoDyn + AeroDyn + * - ``B1N2VIndx`` + - identical + - ElastoDyn + AeroDyn + * - ``B1N2VIndy`` + - sign-flipped + - ElastoDyn + AeroDyn + * - ``B1N3Alpha`` + - identical + - BeamDyn blades, ElastoDyn + AeroDyn + * - ``B1N3Cd`` + - identical + - ElastoDyn + AeroDyn + * - ``B1N3Cl`` + - identical + - ElastoDyn + AeroDyn + * - ``B1N3Clrnc`` + - identical + - Twin-rotor semisubmersible + * - ``B1N3Cm`` + - sign-flipped + - ElastoDyn + AeroDyn + * - ``B1N3Cn`` + - identical + - ElastoDyn + AeroDyn + * - ``B1N3Ct`` + - sign-flipped + - ElastoDyn + AeroDyn + * - ``B1N3Cx`` + - identical + - ElastoDyn + AeroDyn + * - ``B1N3Cy`` + - sign-flipped + - ElastoDyn + AeroDyn + * - ``B1N3Fd`` + - identical + - ElastoDyn + AeroDyn + * - ``B1N3Fl`` + - identical + - ElastoDyn + AeroDyn + * - ``B1N3Fn`` + - identical + - BeamDyn blades, ElastoDyn + AeroDyn + * - ``B1N3Ft`` + - sign-flipped + - BeamDyn blades, ElastoDyn + AeroDyn + * - ``B1N3Fx`` + - identical + - ElastoDyn + AeroDyn + * - ``B1N3Fy`` + - sign-flipped + - ElastoDyn + AeroDyn + * - ``B1N3SigCr`` + - identical + - MHK buoyancy + * - ``B1N3Theta`` + - identical + - BeamDyn blades, ElastoDyn + AeroDyn + * - ``B1N3VIndx`` + - identical + - ElastoDyn + AeroDyn + * - ``B1N3VIndy`` + - below the noise floor + - ElastoDyn + AeroDyn + * - ``B1N6Mbs`` + - sign-flipped + - MHK buoyancy + * - ``B1N7Fbt`` + - sign-flipped + - MHK buoyancy + * - ``B1RootFxr`` + - identical + - BeamDyn blades + * - ``B1RootFyr`` + - sign-flipped + - BeamDyn blades + * - ``B1RootFzr`` + - identical + - BeamDyn blades + * - ``B1RootMxr`` + - sign-flipped + - BeamDyn blades + * - ``B1RootMyr`` + - identical + - BeamDyn blades + * - ``B1RootMzr`` + - sign-flipped + - BeamDyn blades + * - ``B1TipRDxr`` + - sign-flipped + - BeamDyn blades + * - ``B1TipRDyr`` + - identical + - BeamDyn blades + * - ``B1TipRDzr`` + - sign-flipped + - BeamDyn blades + * - ``B1TipTDxr`` + - identical + - BeamDyn blades + * - ``B1TipTDyr`` + - sign-flipped + - BeamDyn blades + * - ``B1TipTDzr`` + - identical + - BeamDyn blades + * - ``B2AeroPwr`` + - identical + - ElastoDyn + AeroDyn + * - ``B2FldMx`` + - sign-flipped + - MHK buoyancy + * - ``B2N3Clrnc`` + - identical + - Twin-rotor semisubmersible + * - ``B2N3Mbt`` + - identical + - MHK buoyancy + * - ``B2N4Fbn`` + - identical + - MHK buoyancy + * - ``B2N5SigCr`` + - identical + - MHK buoyancy + * - ``B2N6SgCav`` + - identical + - MHK buoyancy + * - ``B2N8Fbs`` + - identical + - MHK buoyancy + * - ``B2RootFxr`` + - identical + - BeamDyn blades + * - ``B2RootFyr`` + - sign-flipped + - BeamDyn blades + * - ``B2RootFzr`` + - identical + - BeamDyn blades + * - ``B2RootMxr`` + - sign-flipped + - BeamDyn blades + * - ``B2RootMyr`` + - identical + - BeamDyn blades + * - ``B2RootMzr`` + - sign-flipped + - BeamDyn blades + * - ``B2TipRDxr`` + - sign-flipped + - BeamDyn blades + * - ``B2TipRDyr`` + - identical + - BeamDyn blades + * - ``B2TipRDzr`` + - sign-flipped + - BeamDyn blades + * - ``B2TipTDxr`` + - identical + - BeamDyn blades + * - ``B2TipTDyr`` + - sign-flipped + - BeamDyn blades + * - ``B2TipTDzr`` + - identical + - BeamDyn blades + * - ``B3AeroPwr`` + - identical + - ElastoDyn + AeroDyn + * - ``B3N3Clrnc`` + - identical + - Twin-rotor semisubmersible + * - ``B3RootFxr`` + - identical + - BeamDyn blades + * - ``B3RootFyr`` + - sign-flipped + - BeamDyn blades + * - ``B3RootFzr`` + - identical + - BeamDyn blades + * - ``B3RootMxr`` + - sign-flipped + - BeamDyn blades + * - ``B3RootMyr`` + - identical + - BeamDyn blades + * - ``B3RootMzr`` + - sign-flipped + - BeamDyn blades + * - ``B3TipRDxr`` + - sign-flipped + - BeamDyn blades + * - ``B3TipRDyr`` + - identical + - BeamDyn blades + * - ``B3TipRDzr`` + - sign-flipped + - BeamDyn blades + * - ``B3TipTDxr`` + - identical + - BeamDyn blades + * - ``B3TipTDyr`` + - sign-flipped + - BeamDyn blades + * - ``B3TipTDzr`` + - identical + - BeamDyn blades + * - ``BldPitch1`` + - below the noise floor + - AeroDyn nodal outputs, OLAF free wake, Twin-rotor semisubmersible + * - ``BldPitch2`` + - below the noise floor + - AeroDyn nodal outputs + * - ``BldPitch3`` + - below the noise floor + - AeroDyn nodal outputs + * - ``BlPitch1`` + - below the noise floor + - AeroDisk, yawed + * - ``BlPitch2`` + - below the noise floor + - AeroDisk, yawed + * - ``BlPitch3`` + - below the noise floor + - AeroDisk, yawed + * - ``Case`` + - identical + - AeroDyn nodal outputs, OLAF free wake + * - ``CON10PX`` + - set aside, layout-specific + - MHK buoyancy + * - ``CON10PY`` + - set aside, layout-specific + - MHK buoyancy + * - ``CON10PZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``CON11PX`` + - set aside, layout-specific + - MHK buoyancy + * - ``CON11PY`` + - set aside, layout-specific + - MHK buoyancy + * - ``CON11PZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``CON1FX`` + - set aside, layout-specific + - MHK buoyancy + * - ``CON1FY`` + - set aside, layout-specific + - MHK buoyancy + * - ``CON1FZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``CON2FX`` + - set aside, layout-specific + - MHK buoyancy + * - ``CON2FY`` + - set aside, layout-specific + - MHK buoyancy + * - ``CON2FZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``CON3FX`` + - set aside, layout-specific + - MHK buoyancy + * - ``CON3FY`` + - set aside, layout-specific + - MHK buoyancy + * - ``CON3FZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``CON4FX`` + - set aside, layout-specific + - MHK buoyancy + * - ``CON4FY`` + - set aside, layout-specific + - MHK buoyancy + * - ``CON4FZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``CON5FX`` + - set aside, layout-specific + - MHK buoyancy + * - ``CON5FY`` + - set aside, layout-specific + - MHK buoyancy + * - ``CON5FZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``CON5PX`` + - set aside, layout-specific + - MHK buoyancy + * - ``CON5PY`` + - set aside, layout-specific + - MHK buoyancy + * - ``CON5PZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``CON6FX`` + - set aside, layout-specific + - MHK buoyancy + * - ``CON6FY`` + - set aside, layout-specific + - MHK buoyancy + * - ``CON6FZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``CON6PX`` + - set aside, layout-specific + - MHK buoyancy + * - ``CON6PY`` + - set aside, layout-specific + - MHK buoyancy + * - ``CON6PZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``CON7FX`` + - set aside, layout-specific + - MHK buoyancy + * - ``CON7FY`` + - set aside, layout-specific + - MHK buoyancy + * - ``CON7FZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``CON7PX`` + - set aside, layout-specific + - MHK buoyancy + * - ``CON7PY`` + - set aside, layout-specific + - MHK buoyancy + * - ``CON7PZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``CON8FX`` + - set aside, layout-specific + - MHK buoyancy + * - ``CON8FY`` + - set aside, layout-specific + - MHK buoyancy + * - ``CON8FZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``CON8PX`` + - set aside, layout-specific + - MHK buoyancy + * - ``CON8PY`` + - set aside, layout-specific + - MHK buoyancy + * - ``CON8PZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``CON9PX`` + - set aside, layout-specific + - MHK buoyancy + * - ``CON9PY`` + - set aside, layout-specific + - MHK buoyancy + * - ``CON9PZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``FAIRTEN1`` + - set aside, layout-specific + - MHK buoyancy + * - ``FAIRTEN2`` + - set aside, layout-specific + - MHK buoyancy + * - ``FAIRTEN3`` + - set aside, layout-specific + - MHK buoyancy + * - ``FAIRTEN4`` + - set aside, layout-specific + - MHK buoyancy + * - ``GenAcc`` + - below the noise floor + - AeroDisk, yawed + * - ``GenAccel`` + - identical + - BeamDyn blades, ElastoDyn + AeroDyn + * - ``GenPwr`` + - identical + - Twin-rotor semisubmersible + * - ``GenSpeed`` + - identical + - AeroDisk, yawed, BeamDyn blades, ElastoDyn + AeroDyn, Twin-rotor semisubmersible + * - ``GenTq`` + - identical + - Twin-rotor semisubmersible + * - ``HbFbx`` + - identical + - MHK buoyancy + * - ``HbFby`` + - sign-flipped + - MHK buoyancy + * - ``HbFbz`` + - identical + - MHK buoyancy + * - ``HbMbx`` + - sign-flipped + - MHK buoyancy + * - ``HbMby`` + - identical + - MHK buoyancy + * - ``HbMbz`` + - sign-flipped + - MHK buoyancy + * - ``HSShftPwr`` + - identical + - BeamDyn blades, ElastoDyn + AeroDyn + * - ``HSShftTq`` + - identical + - BeamDyn blades, ElastoDyn + AeroDyn + * - ``HWindSpeedX`` + - identical + - AeroDyn nodal outputs, OLAF free wake + * - ``HWindSpeedY`` + - below the noise floor + - AeroDyn nodal outputs, OLAF free wake + * - ``HWindSpeedZ`` + - below the noise floor + - AeroDyn nodal outputs, OLAF free wake + * - ``HydroFxi`` + - identical + - MHK buoyancy + * - ``HydroFyi`` + - sign-flipped + - MHK buoyancy + * - ``HydroFzi`` + - identical + - MHK buoyancy + * - ``IPDefl1`` + - sign-flipped + - BeamDyn blades, ElastoDyn + AeroDyn, Twin-rotor semisubmersible + * - ``IPDefl2`` + - sign-flipped + - BeamDyn blades, ElastoDyn + AeroDyn + * - ``IPDefl3`` + - sign-flipped + - BeamDyn blades, ElastoDyn + AeroDyn + * - ``L1N10PZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``L1N11PZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``L1N12PZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``L1N13PZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``L1N14PZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``L1N15PZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``L1N16PZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``L1N17PZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``L1N18PZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``L1N19PZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``L1N1PZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``L1N20PZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``L1N21PZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``L1N22PZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``L1N23PZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``L1N24PZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``L1N25PZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``L1N26PZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``L1N27PZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``L1N28PZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``L1N29PZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``L1N2PZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``L1N30PZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``L1N31PZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``L1N32PZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``L1N33PZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``L1N34PZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``L1N35PZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``L1N36PZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``L1N37PZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``L1N38PZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``L1N39PZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``L1N3PZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``L1N40PZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``L1N4PZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``L1N5PZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``L1N6PZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``L1N7PZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``L1N8PZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``L1N9PZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``L3N10PZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``L3N11PZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``L3N12PZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``L3N13PZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``L3N14PZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``L3N15PZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``L3N16PZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``L3N17PZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``L3N18PZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``L3N19PZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``L3N1PZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``L3N20PZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``L3N21PZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``L3N22PZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``L3N23PZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``L3N24PZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``L3N25PZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``L3N26PZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``L3N27PZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``L3N28PZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``L3N29PZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``L3N2PZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``L3N30PZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``L3N31PZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``L3N32PZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``L3N33PZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``L3N34PZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``L3N35PZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``L3N36PZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``L3N37PZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``L3N38PZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``L3N39PZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``L3N3PZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``L3N40PZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``L3N4PZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``L3N5PZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``L3N6PZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``L3N7PZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``L3N8PZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``L3N9PZ`` + - set aside, layout-specific + - MHK buoyancy + * - ``LSSGagMxa`` + - sign-flipped + - BeamDyn blades, ElastoDyn + AeroDyn + * - ``LSSGagMya`` + - identical + - Twin-rotor semisubmersible + * - ``LSSGagMza`` + - sign-flipped + - Twin-rotor semisubmersible + * - ``LSShftFxa`` + - identical + - BeamDyn blades, ElastoDyn + AeroDyn + * - ``LSShftFya`` + - sign-flipped + - BeamDyn blades, ElastoDyn + AeroDyn + * - ``LSShftFza`` + - identical + - BeamDyn blades, ElastoDyn + AeroDyn + * - ``LSShftMxa`` + - sign-flipped + - BeamDyn blades, ElastoDyn + AeroDyn + * - ``LSShftTq`` + - identical + - BeamDyn blades, ElastoDyn + AeroDyn + * - ``LSSTipAxa`` + - sign-flipped + - BeamDyn blades, ElastoDyn + AeroDyn + * - ``LSSTipMya`` + - identical + - BeamDyn blades, ElastoDyn + AeroDyn + * - ``LSSTipMza`` + - sign-flipped + - BeamDyn blades, ElastoDyn + AeroDyn + * - ``LSSTipPxa`` + - mirrored angle + - BeamDyn blades, ElastoDyn + AeroDyn + * - ``LSSTipVxa`` + - sign-flipped + - BeamDyn blades, ElastoDyn + AeroDyn + * - ``NcFbx`` + - below the noise floor + - MHK buoyancy + * - ``NcFby`` + - below the noise floor + - MHK buoyancy + * - ``NcFbz`` + - below the noise floor + - MHK buoyancy + * - ``NcIMUTAxs`` + - identical + - Twin-rotor semisubmersible + * - ``NcIMUTAys`` + - sign-flipped + - Twin-rotor semisubmersible + * - ``NcIMUTAzs`` + - identical + - Twin-rotor semisubmersible + * - ``NcMbx`` + - below the noise floor + - MHK buoyancy + * - ``NcMby`` + - below the noise floor + - MHK buoyancy + * - ``NcMbz`` + - below the noise floor + - MHK buoyancy + * - ``OoPDefl1`` + - identical + - BeamDyn blades, ElastoDyn + AeroDyn, MHK buoyancy, Twin-rotor semisubmersible + * - ``OoPDefl2`` + - identical + - BeamDyn blades, ElastoDyn + AeroDyn + * - ``OoPDefl3`` + - identical + - BeamDyn blades, ElastoDyn + AeroDyn + * - ``PtfmHeave`` + - identical + - AeroDyn nodal outputs, MHK buoyancy, OLAF free wake, Twin-rotor semisubmersible + * - ``PtfmPitch`` + - identical + - AeroDyn nodal outputs, MHK buoyancy, OLAF free wake, Twin-rotor semisubmersible + * - ``PtfmRoll`` + - sign-flipped + - AeroDyn nodal outputs, MHK buoyancy, OLAF free wake, Twin-rotor semisubmersible + * - ``PtfmSurge`` + - identical + - AeroDyn nodal outputs, MHK buoyancy, OLAF free wake, Twin-rotor semisubmersible + * - ``PtfmSway`` + - sign-flipped + - AeroDyn nodal outputs, MHK buoyancy, OLAF free wake, Twin-rotor semisubmersible + * - ``PtfmYaw`` + - sign-flipped + - AeroDyn nodal outputs, MHK buoyancy, OLAF free wake, Twin-rotor semisubmersible + * - ``RootFxb1`` + - identical + - Twin-rotor semisubmersible + * - ``RootFxc1`` + - identical + - BeamDyn blades, ElastoDyn + AeroDyn, Twin-rotor semisubmersible + * - ``RootFyb1`` + - sign-flipped + - Twin-rotor semisubmersible + * - ``RootFyc1`` + - sign-flipped + - BeamDyn blades, ElastoDyn + AeroDyn, Twin-rotor semisubmersible + * - ``RootFzb1`` + - identical + - Twin-rotor semisubmersible + * - ``RootFzc1`` + - identical + - Twin-rotor semisubmersible + * - ``RootMxb1`` + - sign-flipped + - Twin-rotor semisubmersible + * - ``RootMxc1`` + - sign-flipped + - BeamDyn blades, ElastoDyn + AeroDyn, Twin-rotor semisubmersible + * - ``RootMxc2`` + - sign-flipped + - BeamDyn blades, ElastoDyn + AeroDyn + * - ``RootMxc3`` + - sign-flipped + - BeamDyn blades, ElastoDyn + AeroDyn + * - ``RootMyb1`` + - identical + - Twin-rotor semisubmersible + * - ``RootMyc1`` + - identical + - BeamDyn blades, ElastoDyn + AeroDyn, Twin-rotor semisubmersible + * - ``RootMyc2`` + - identical + - BeamDyn blades, ElastoDyn + AeroDyn + * - ``RootMyc3`` + - identical + - BeamDyn blades, ElastoDyn + AeroDyn + * - ``RootMzb1`` + - sign-flipped + - Twin-rotor semisubmersible + * - ``RootMzc1`` + - sign-flipped + - BeamDyn blades, ElastoDyn + AeroDyn, Twin-rotor semisubmersible + * - ``RotAcc`` + - below the noise floor + - AeroDisk, yawed + * - ``RotAccel`` + - identical + - BeamDyn blades, ElastoDyn + AeroDyn + * - ``RotPwr`` + - identical + - AeroDisk, yawed, BeamDyn blades, ElastoDyn + AeroDyn + * - ``RotSpeed`` + - identical + - AeroDisk, yawed, AeroDyn nodal outputs, BeamDyn blades, ElastoDyn + AeroDyn, OLAF free wake, Twin-rotor semisubmersible + * - ``RotThrust`` + - identical + - BeamDyn blades, ElastoDyn + AeroDyn + * - ``RotTorq`` + - identical + - AeroDisk, yawed, BeamDyn blades, ElastoDyn + AeroDyn, Twin-rotor semisubmersible + * - ``RtAeroCp`` + - identical + - AeroDyn nodal outputs, ElastoDyn + AeroDyn + * - ``RtAeroCq`` + - sign-flipped + - AeroDyn nodal outputs, ElastoDyn + AeroDyn + * - ``RtAeroCt`` + - identical + - AeroDyn nodal outputs, ElastoDyn + AeroDyn + * - ``RtAeroFxh`` + - identical + - AeroDyn nodal outputs, BeamDyn blades, ElastoDyn + AeroDyn, Twin-rotor semisubmersible + * - ``RtAeroFyh`` + - sign-flipped + - AeroDyn nodal outputs, ElastoDyn + AeroDyn, Twin-rotor semisubmersible + * - ``RtAeroFzh`` + - identical + - AeroDyn nodal outputs, ElastoDyn + AeroDyn, Twin-rotor semisubmersible + * - ``RtAeroMxh`` + - sign-flipped + - BeamDyn blades, ElastoDyn + AeroDyn, Twin-rotor semisubmersible + * - ``RtAeroMyh`` + - identical + - AeroDyn nodal outputs, ElastoDyn + AeroDyn, Twin-rotor semisubmersible + * - ``RtAeroMzh`` + - sign-flipped + - ElastoDyn + AeroDyn, Twin-rotor semisubmersible + * - ``RtAeroPwr`` + - identical + - AeroDyn nodal outputs, BeamDyn blades, ElastoDyn + AeroDyn + * - ``RtArea`` + - identical + - AeroDyn nodal outputs, Twin-rotor semisubmersible + * - ``RtFldFxh`` + - identical + - MHK buoyancy + * - ``RtFldFyh`` + - sign-flipped + - MHK buoyancy + * - ``RtFldFzg`` + - identical + - MHK buoyancy + * - ``RtFldMxh`` + - sign-flipped + - MHK buoyancy + * - ``RtFldMyg`` + - identical + - MHK buoyancy + * - ``RtFldMzh`` + - sign-flipped + - MHK buoyancy + * - ``RtSkew`` + - identical + - AeroDyn nodal outputs, BeamDyn blades, ElastoDyn + AeroDyn + * - ``RtSpeed`` + - identical + - AeroDyn nodal outputs, ElastoDyn + AeroDyn + * - ``RtTSR`` + - identical + - AeroDyn nodal outputs, BeamDyn blades, ElastoDyn + AeroDyn + * - ``RtVAvgxh`` + - identical + - AeroDyn nodal outputs, Twin-rotor semisubmersible + * - ``RtVAvgyh`` + - sign-flipped + - AeroDyn nodal outputs + * - ``RtVAvgzh`` + - identical + - AeroDyn nodal outputs + * - ``ShearExp`` + - identical + - AeroDyn nodal outputs, OLAF free wake + * - ``Time`` + - identical + - AeroDisk, yawed, AeroDyn nodal outputs, BeamDyn blades, ElastoDyn + AeroDyn, MHK buoyancy, OLAF free wake + * - ``TipDxc1`` + - identical + - BeamDyn blades, ElastoDyn + AeroDyn + * - ``TipDyc1`` + - sign-flipped + - BeamDyn blades, ElastoDyn + AeroDyn + * - ``TTDspFA`` + - identical + - Twin-rotor semisubmersible + * - ``TTDspSS`` + - sign-flipped + - Twin-rotor semisubmersible + * - ``TTDspTwst`` + - below the noise floor + - Twin-rotor semisubmersible + * - ``TwN1Fbx`` + - below the noise floor + - MHK buoyancy + * - ``TwN1Mbx`` + - below the noise floor + - MHK buoyancy + * - ``TwN2Mby`` + - below the noise floor + - MHK buoyancy + * - ``TwN3Fby`` + - below the noise floor + - MHK buoyancy + * - ``TwN3Mbz`` + - below the noise floor + - MHK buoyancy + * - ``TwN4Fbz`` + - below the noise floor + - MHK buoyancy + * - ``TwrBsFxt`` + - identical + - BeamDyn blades, ElastoDyn + AeroDyn, Twin-rotor semisubmersible + * - ``TwrBsFyt`` + - sign-flipped + - BeamDyn blades, ElastoDyn + AeroDyn, Twin-rotor semisubmersible + * - ``TwrBsFzt`` + - identical + - Twin-rotor semisubmersible + * - ``TwrBsMxt`` + - sign-flipped + - BeamDyn blades, ElastoDyn + AeroDyn, Twin-rotor semisubmersible + * - ``TwrBsMyt`` + - identical + - BeamDyn blades, ElastoDyn + AeroDyn, Twin-rotor semisubmersible + * - ``TwrBsMzt`` + - sign-flipped + - BeamDyn blades, ElastoDyn + AeroDyn, Twin-rotor semisubmersible + * - ``TwrTpTDxi`` + - identical + - MHK buoyancy + * - ``TwrTpTDyi`` + - sign-flipped + - MHK buoyancy + * - ``TwrTpTDzi`` + - identical + - MHK buoyancy + * - ``TwstDefl1`` + - below the noise floor + - Twin-rotor semisubmersible + * - ``Wave1Elev`` + - identical + - MHK buoyancy + * - ``Wind1VelX`` + - identical + - AeroDisk, yawed, AeroDyn nodal outputs, BeamDyn blades, ElastoDyn + AeroDyn + * - ``Wind1VelY`` + - below the noise floor + - AeroDisk, yawed, AeroDyn nodal outputs, BeamDyn blades, ElastoDyn + AeroDyn + * - ``Wind1VelZ`` + - below the noise floor + - AeroDisk, yawed, AeroDyn nodal outputs, BeamDyn blades, ElastoDyn + AeroDyn + * - ``Yaw`` + - sign-flipped + - AeroDisk, yawed, AeroDyn nodal outputs, OLAF free wake + * - ``YawBrFxp`` + - identical + - BeamDyn blades, ElastoDyn + AeroDyn, Twin-rotor semisubmersible + * - ``YawBrFyp`` + - sign-flipped + - BeamDyn blades, ElastoDyn + AeroDyn, Twin-rotor semisubmersible + * - ``YawBrFzp`` + - identical + - BeamDyn blades, ElastoDyn + AeroDyn, Twin-rotor semisubmersible + * - ``YawBrMxp`` + - sign-flipped + - BeamDyn blades, ElastoDyn + AeroDyn, Twin-rotor semisubmersible + * - ``YawBrMyp`` + - identical + - BeamDyn blades, ElastoDyn + AeroDyn, Twin-rotor semisubmersible + * - ``YawBrMzp`` + - sign-flipped + - BeamDyn blades, ElastoDyn + AeroDyn, Twin-rotor semisubmersible + * - ``YawRate`` + - below the noise floor + - AeroDisk, yawed diff --git a/docs/source/user/glue-code/mirror_rotor_sign_map.yaml b/docs/source/user/glue-code/mirror_rotor_sign_map.yaml new file mode 100644 index 0000000000..57ffd47afb --- /dev/null +++ b/docs/source/user/glue-code/mirror_rotor_sign_map.yaml @@ -0,0 +1,1220 @@ +# Measured mirror sign map -- GENERATED, do not edit by hand. +# Regenerate with: +# python3 reg_tests/otherTests/emit_sign_table.py --tol 0.005 --emit-map +# +# Every entry is observed by running a registered clockwise/mirrored +# pair and comparing the channel against its counterpart. Nothing here +# is inferred from reading the source. +tolerance: 0.005 +noise_floor: 1e-08 +behaviours: + S: {name: "identical", meaning: "v' = v"} + F: {name: "sign-flipped", meaning: "v' = -v"} + A: {name: "mirrored angle", meaning: "v' = -v, wrapped"} + negligible: {name: "below the noise floor", meaning: "indistinguishable from zero everywhere"} + "?": {name: "unresolved", meaning: "measured but not classified"} + mooring: {name: "set aside", meaning: "pairing is layout-specific"} +channels: + AB1N001Alpha: {behaviour: S, measured_in: [AeroDyn nodal outputs, OLAF free wake]} + AB1N001AxInd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N001Cd: {behaviour: S, measured_in: [AeroDyn nodal outputs, OLAF free wake]} + AB1N001Cl: {behaviour: S, measured_in: [AeroDyn nodal outputs, OLAF free wake]} + AB1N001Cm: {behaviour: F, measured_in: [AeroDyn nodal outputs, OLAF free wake]} + AB1N001Cn: {behaviour: S, measured_in: [AeroDyn nodal outputs, OLAF free wake]} + AB1N001Ct: {behaviour: F, measured_in: [AeroDyn nodal outputs, OLAF free wake]} + AB1N001Cx: {behaviour: S, measured_in: [AeroDyn nodal outputs, OLAF free wake]} + AB1N001Cy: {behaviour: F, measured_in: [AeroDyn nodal outputs, OLAF free wake]} + AB1N001Fd: {behaviour: S, measured_in: [AeroDyn nodal outputs, OLAF free wake]} + AB1N001Fl: {behaviour: S, measured_in: [AeroDyn nodal outputs, OLAF free wake]} + AB1N001Fn: {behaviour: S, measured_in: [AeroDyn nodal outputs, OLAF free wake]} + AB1N001Ft: {behaviour: F, measured_in: [AeroDyn nodal outputs, OLAF free wake]} + AB1N001Fx: {behaviour: negligible, measured_in: [AeroDyn nodal outputs]} + AB1N001Fy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N001Gam: {behaviour: S, measured_in: [AeroDyn nodal outputs, OLAF free wake]} + AB1N001Mm: {behaviour: negligible, measured_in: [AeroDyn nodal outputs]} + AB1N001Phi: {behaviour: S, measured_in: [AeroDyn nodal outputs, OLAF free wake]} + AB1N001STVx: {behaviour: negligible, measured_in: [OLAF free wake]} + AB1N001STVy: {behaviour: F, measured_in: [AeroDyn nodal outputs, OLAF free wake]} + AB1N001STVz: {behaviour: negligible, measured_in: [OLAF free wake]} + AB1N001Theta: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N001TnInd: {behaviour: negligible, measured_in: [AeroDyn nodal outputs]} + AB1N001VDisx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N001Vindx: {behaviour: S, measured_in: [AeroDyn nodal outputs, OLAF free wake]} + AB1N001Vindy: {behaviour: F, measured_in: [AeroDyn nodal outputs, OLAF free wake]} + AB1N001VRel: {behaviour: S, measured_in: [OLAF free wake]} + AB1N001Vrel: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N001VUndx: {behaviour: S, measured_in: [AeroDyn nodal outputs, OLAF free wake]} + AB1N001VUndy: {behaviour: F, measured_in: [OLAF free wake]} + AB1N001VUndz: {behaviour: S, measured_in: [OLAF free wake]} + AB1N002Alpha: {behaviour: S, measured_in: [AeroDyn nodal outputs, OLAF free wake]} + AB1N002AxInd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N002Cd: {behaviour: S, measured_in: [AeroDyn nodal outputs, OLAF free wake]} + AB1N002Cl: {behaviour: S, measured_in: [AeroDyn nodal outputs, OLAF free wake]} + AB1N002Cm: {behaviour: F, measured_in: [AeroDyn nodal outputs, OLAF free wake]} + AB1N002Cn: {behaviour: S, measured_in: [AeroDyn nodal outputs, OLAF free wake]} + AB1N002Ct: {behaviour: F, measured_in: [AeroDyn nodal outputs, OLAF free wake]} + AB1N002Cx: {behaviour: S, measured_in: [AeroDyn nodal outputs, OLAF free wake]} + AB1N002Cy: {behaviour: F, measured_in: [AeroDyn nodal outputs, OLAF free wake]} + AB1N002Fd: {behaviour: S, measured_in: [AeroDyn nodal outputs, OLAF free wake]} + AB1N002Fl: {behaviour: S, measured_in: [AeroDyn nodal outputs, OLAF free wake]} + AB1N002Fn: {behaviour: S, measured_in: [AeroDyn nodal outputs, OLAF free wake]} + AB1N002Ft: {behaviour: F, measured_in: [AeroDyn nodal outputs, OLAF free wake]} + AB1N002Fx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N002Fy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N002Gam: {behaviour: S, measured_in: [AeroDyn nodal outputs, OLAF free wake]} + AB1N002Mm: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N002Phi: {behaviour: S, measured_in: [AeroDyn nodal outputs, OLAF free wake]} + AB1N002STVx: {behaviour: negligible, measured_in: [OLAF free wake]} + AB1N002STVy: {behaviour: F, measured_in: [AeroDyn nodal outputs, OLAF free wake]} + AB1N002STVz: {behaviour: negligible, measured_in: [OLAF free wake]} + AB1N002Theta: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N002TnInd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N002VDisx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N002Vindx: {behaviour: S, measured_in: [AeroDyn nodal outputs, OLAF free wake]} + AB1N002Vindy: {behaviour: F, measured_in: [AeroDyn nodal outputs, OLAF free wake]} + AB1N002VRel: {behaviour: S, measured_in: [OLAF free wake]} + AB1N002Vrel: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N002VUndx: {behaviour: S, measured_in: [AeroDyn nodal outputs, OLAF free wake]} + AB1N002VUndy: {behaviour: F, measured_in: [OLAF free wake]} + AB1N002VUndz: {behaviour: S, measured_in: [OLAF free wake]} + AB1N003Alpha: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N003AxInd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N003Cd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N003Cl: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N003Cm: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N003Cn: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N003Ct: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N003Cx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N003Cy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N003Fd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N003Fl: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N003Fn: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N003Ft: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N003Fx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N003Fy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N003Gam: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N003Mm: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N003Phi: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N003STVy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N003Theta: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N003TnInd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N003VDisx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N003Vindx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N003Vindy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N003Vrel: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N003VUndx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N004Alpha: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N004AxInd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N004Cd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N004Cl: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N004Cm: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N004Cn: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N004Ct: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N004Cx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N004Cy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N004Fd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N004Fl: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N004Fn: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N004Ft: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N004Fx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N004Fy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N004Gam: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N004Mm: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N004Phi: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N004STVy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N004Theta: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N004TnInd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N004VDisx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N004Vindx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N004Vindy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N004Vrel: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N004VUndx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N005Alpha: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N005AxInd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N005Cd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N005Cl: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N005Cm: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N005Cn: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N005Ct: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N005Cx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N005Cy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N005Fd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N005Fl: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N005Fn: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N005Ft: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N005Fx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N005Fy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N005Gam: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N005Mm: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N005Phi: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N005STVy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N005Theta: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N005TnInd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N005VDisx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N005Vindx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N005Vindy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N005Vrel: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N005VUndx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N006Alpha: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N006AxInd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N006Cd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N006Cl: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N006Cm: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N006Cn: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N006Ct: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N006Cx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N006Cy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N006Fd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N006Fl: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N006Fn: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N006Ft: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N006Fx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N006Fy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N006Gam: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N006Mm: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N006Phi: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N006STVy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N006Theta: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N006TnInd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N006VDisx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N006Vindx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N006Vindy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N006Vrel: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N006VUndx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N007Alpha: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N007AxInd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N007Cd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N007Cl: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N007Cm: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N007Cn: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N007Ct: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N007Cx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N007Cy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N007Fd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N007Fl: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N007Fn: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N007Ft: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N007Fx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N007Fy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N007Gam: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N007Mm: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N007Phi: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N007STVy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N007Theta: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N007TnInd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N007VDisx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N007Vindx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N007Vindy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N007Vrel: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N007VUndx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N008Alpha: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N008AxInd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N008Cd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N008Cl: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N008Cm: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N008Cn: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N008Ct: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N008Cx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N008Cy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N008Fd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N008Fl: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N008Fn: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N008Ft: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N008Fx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N008Fy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N008Gam: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N008Mm: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N008Phi: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N008STVy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N008Theta: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N008TnInd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N008VDisx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N008Vindx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N008Vindy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N008Vrel: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N008VUndx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N009Alpha: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N009AxInd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N009Cd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N009Cl: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N009Cm: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N009Cn: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N009Ct: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N009Cx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N009Cy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N009Fd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N009Fl: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N009Fn: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N009Ft: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N009Fx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N009Fy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N009Gam: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N009Mm: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N009Phi: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N009STVy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N009Theta: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N009TnInd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N009VDisx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N009Vindx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N009Vindy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N009Vrel: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N009VUndx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N010Alpha: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N010AxInd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N010Cd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N010Cl: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N010Cm: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N010Cn: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N010Ct: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N010Cx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N010Cy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N010Fd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N010Fl: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N010Fn: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N010Ft: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N010Fx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N010Fy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N010Gam: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N010Mm: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N010Phi: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N010STVy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N010Theta: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N010TnInd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N010VDisx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N010Vindx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N010Vindy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N010Vrel: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N010VUndx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N011Alpha: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N011AxInd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N011Cd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N011Cl: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N011Cm: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N011Cn: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N011Ct: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N011Cx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N011Cy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N011Fd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N011Fl: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N011Fn: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N011Ft: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N011Fx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N011Fy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N011Gam: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N011Mm: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N011Phi: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N011STVy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N011Theta: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N011TnInd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N011VDisx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N011Vindx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N011Vindy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N011Vrel: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N011VUndx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N012Alpha: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N012AxInd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N012Cd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N012Cl: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N012Cm: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N012Cn: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N012Ct: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N012Cx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N012Cy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N012Fd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N012Fl: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N012Fn: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N012Ft: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N012Fx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N012Fy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N012Gam: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N012Mm: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N012Phi: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N012STVy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N012Theta: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N012TnInd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N012VDisx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N012Vindx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N012Vindy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N012Vrel: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N012VUndx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N013Alpha: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N013AxInd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N013Cd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N013Cl: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N013Cm: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N013Cn: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N013Ct: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N013Cx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N013Cy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N013Fd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N013Fl: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N013Fn: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N013Ft: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N013Fx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N013Fy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N013Gam: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N013Mm: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N013Phi: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N013STVy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N013Theta: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N013TnInd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N013VDisx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N013Vindx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N013Vindy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N013Vrel: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N013VUndx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N014Alpha: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N014AxInd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N014Cd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N014Cl: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N014Cm: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N014Cn: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N014Ct: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N014Cx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N014Cy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N014Fd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N014Fl: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N014Fn: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N014Ft: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N014Fx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N014Fy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N014Gam: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N014Mm: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N014Phi: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N014STVy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N014Theta: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N014TnInd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N014VDisx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N014Vindx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N014Vindy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N014Vrel: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N014VUndx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N015Alpha: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N015AxInd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N015Cd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N015Cl: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N015Cm: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N015Cn: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N015Ct: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N015Cx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N015Cy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N015Fd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N015Fl: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N015Fn: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N015Ft: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N015Fx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N015Fy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N015Gam: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N015Mm: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N015Phi: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N015STVy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N015Theta: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N015TnInd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N015VDisx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N015Vindx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N015Vindy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N015Vrel: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N015VUndx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N016Alpha: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N016AxInd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N016Cd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N016Cl: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N016Cm: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N016Cn: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N016Ct: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N016Cx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N016Cy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N016Fd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N016Fl: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N016Fn: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N016Ft: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N016Fx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N016Fy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N016Gam: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N016Mm: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N016Phi: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N016STVy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N016Theta: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N016TnInd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N016VDisx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N016Vindx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N016Vindy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N016Vrel: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N016VUndx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N017Alpha: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N017AxInd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N017Cd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N017Cl: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N017Cm: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N017Cn: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N017Ct: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N017Cx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N017Cy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N017Fd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N017Fl: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N017Fn: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N017Ft: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N017Fx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N017Fy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N017Gam: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N017Mm: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N017Phi: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N017STVy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N017Theta: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N017TnInd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N017VDisx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N017Vindx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N017Vindy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N017Vrel: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N017VUndx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N018Alpha: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N018AxInd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N018Cd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N018Cl: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N018Cm: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N018Cn: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N018Ct: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N018Cx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N018Cy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N018Fd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N018Fl: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N018Fn: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N018Ft: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N018Fx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N018Fy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N018Gam: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N018Mm: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N018Phi: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N018STVy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N018Theta: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N018TnInd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N018VDisx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N018Vindx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N018Vindy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N018Vrel: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N018VUndx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N019Alpha: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N019AxInd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N019Cd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N019Cl: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N019Cm: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N019Cn: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N019Ct: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N019Cx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N019Cy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N019Fd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N019Fl: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N019Fn: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N019Ft: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N019Fx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N019Fy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N019Gam: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N019Mm: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N019Phi: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N019STVy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N019Theta: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N019TnInd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N019VDisx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N019Vindx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N019Vindy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N019Vrel: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N019VUndx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N020Alpha: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N020AxInd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N020Cd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N020Cl: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N020Cm: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N020Cn: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N020Ct: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N020Cx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N020Cy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N020Fd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N020Fl: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N020Fn: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N020Ft: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N020Fx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N020Fy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N020Gam: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N020Mm: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N020Phi: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N020STVy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N020Theta: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N020TnInd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N020VDisx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N020Vindx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N020Vindy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N020Vrel: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N020VUndx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N021Alpha: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N021AxInd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N021Cd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N021Cl: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N021Cm: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N021Cn: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N021Ct: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N021Cx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N021Cy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N021Fd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N021Fl: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N021Fn: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N021Ft: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N021Fx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N021Fy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N021Gam: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N021Mm: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N021Phi: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N021STVy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N021Theta: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N021TnInd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N021VDisx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N021Vindx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N021Vindy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N021Vrel: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N021VUndx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N022Alpha: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N022AxInd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N022Cd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N022Cl: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N022Cm: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N022Cn: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N022Ct: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N022Cx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N022Cy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N022Fd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N022Fl: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N022Fn: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N022Ft: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N022Fx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N022Fy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N022Gam: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N022Mm: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N022Phi: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N022STVy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N022Theta: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N022TnInd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N022VDisx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N022Vindx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N022Vindy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N022Vrel: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N022VUndx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N023Alpha: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N023AxInd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N023Cd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N023Cl: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N023Cm: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N023Cn: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N023Ct: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N023Cx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N023Cy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N023Fd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N023Fl: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N023Fn: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N023Ft: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N023Fx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N023Fy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N023Gam: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N023Mm: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N023Phi: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N023STVy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N023Theta: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N023TnInd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N023VDisx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N023Vindx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N023Vindy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N023Vrel: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N023VUndx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N024Alpha: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N024AxInd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N024Cd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N024Cl: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N024Cm: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N024Cn: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N024Ct: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N024Cx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N024Cy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N024Fd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N024Fl: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N024Fn: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N024Ft: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N024Fx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N024Fy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N024Gam: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N024Mm: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N024Phi: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N024STVy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N024Theta: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N024TnInd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N024VDisx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N024Vindx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N024Vindy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N024Vrel: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N024VUndx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N025Alpha: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N025AxInd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N025Cd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N025Cl: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N025Cm: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N025Cn: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N025Ct: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N025Cx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N025Cy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N025Fd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N025Fl: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N025Fn: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N025Ft: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N025Fx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N025Fy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N025Gam: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N025Mm: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N025Phi: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N025STVy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N025Theta: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N025TnInd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N025VDisx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N025Vindx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N025Vindy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N025Vrel: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N025VUndx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N026Alpha: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N026AxInd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N026Cd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N026Cl: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N026Cm: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N026Cn: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N026Ct: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N026Cx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N026Cy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N026Fd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N026Fl: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N026Fn: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N026Ft: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N026Fx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N026Fy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N026Gam: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N026Mm: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N026Phi: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N026STVy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N026Theta: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N026TnInd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N026VDisx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N026Vindx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N026Vindy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N026Vrel: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N026VUndx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N027Alpha: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N027AxInd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N027Cd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N027Cl: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N027Cm: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N027Cn: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N027Ct: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N027Cx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N027Cy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N027Fd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N027Fl: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N027Fn: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N027Ft: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N027Fx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N027Fy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N027Gam: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N027Mm: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N027Phi: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N027STVy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N027Theta: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N027TnInd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N027VDisx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N027Vindx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N027Vindy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N027Vrel: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N027VUndx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N028Alpha: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N028AxInd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N028Cd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N028Cl: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N028Cm: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N028Cn: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N028Ct: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N028Cx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N028Cy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N028Fd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N028Fl: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N028Fn: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N028Ft: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N028Fx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N028Fy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N028Gam: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N028Mm: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N028Phi: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N028STVy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N028Theta: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N028TnInd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N028VDisx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N028Vindx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N028Vindy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N028Vrel: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N028VUndx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N029Alpha: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N029AxInd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N029Cd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N029Cl: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N029Cm: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N029Cn: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N029Ct: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N029Cx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N029Cy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N029Fd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N029Fl: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N029Fn: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N029Ft: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N029Fx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N029Fy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N029Gam: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N029Mm: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N029Phi: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N029STVy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N029Theta: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N029TnInd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N029VDisx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N029Vindx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N029Vindy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N029Vrel: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N029VUndx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N030Alpha: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N030AxInd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N030Cd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N030Cl: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N030Cm: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N030Cn: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N030Ct: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N030Cx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N030Cy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N030Fd: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N030Fl: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N030Fn: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N030Ft: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N030Fx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N030Fy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N030Gam: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N030Mm: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N030Phi: {behaviour: negligible, measured_in: [AeroDyn nodal outputs]} + AB1N030STVy: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + AB1N030Theta: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N030TnInd: {behaviour: negligible, measured_in: [AeroDyn nodal outputs]} + AB1N030VDisx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N030Vindx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N030Vindy: {behaviour: negligible, measured_in: [AeroDyn nodal outputs]} + AB1N030Vrel: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + AB1N030VUndx: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + ADCp: {behaviour: S, measured_in: [AeroDisk, yawed]} + ADCq: {behaviour: S, measured_in: [AeroDisk, yawed]} + ADCt: {behaviour: S, measured_in: [AeroDisk, yawed]} + ADFx: {behaviour: S, measured_in: [AeroDisk, yawed]} + ADFxi: {behaviour: S, measured_in: [AeroDisk, yawed]} + ADFy: {behaviour: S, measured_in: [AeroDisk, yawed]} + ADFyi: {behaviour: F, measured_in: [AeroDisk, yawed]} + ADFz: {behaviour: S, measured_in: [AeroDisk, yawed]} + ADFzi: {behaviour: S, measured_in: [AeroDisk, yawed]} + ADMx: {behaviour: F, measured_in: [AeroDisk, yawed]} + ADMxi: {behaviour: F, measured_in: [AeroDisk, yawed]} + ADMy: {behaviour: F, measured_in: [AeroDisk, yawed]} + ADMyi: {behaviour: S, measured_in: [AeroDisk, yawed]} + ADMz: {behaviour: F, measured_in: [AeroDisk, yawed]} + ADMzi: {behaviour: F, measured_in: [AeroDisk, yawed]} + ADPitch: {behaviour: negligible, measured_in: [AeroDisk, yawed]} + ADPower: {behaviour: S, measured_in: [AeroDisk, yawed]} + ADSkew: {behaviour: S, measured_in: [AeroDisk, yawed]} + ADSpeed: {behaviour: F, measured_in: [AeroDisk, yawed]} + ADSTVx: {behaviour: negligible, measured_in: [AeroDisk, yawed]} + ADSTVxi: {behaviour: negligible, measured_in: [AeroDisk, yawed]} + ADSTVy: {behaviour: negligible, measured_in: [AeroDisk, yawed]} + ADSTVyi: {behaviour: negligible, measured_in: [AeroDisk, yawed]} + ADSTVz: {behaviour: negligible, measured_in: [AeroDisk, yawed]} + ADSTVzi: {behaviour: negligible, measured_in: [AeroDisk, yawed]} + ADTSR: {behaviour: S, measured_in: [AeroDisk, yawed]} + ADVRel: {behaviour: S, measured_in: [AeroDisk, yawed]} + ADVWindx: {behaviour: S, measured_in: [AeroDisk, yawed]} + ADVWindxi: {behaviour: S, measured_in: [AeroDisk, yawed]} + ADVWindy: {behaviour: S, measured_in: [AeroDisk, yawed]} + ADVWindyi: {behaviour: negligible, measured_in: [AeroDisk, yawed]} + ADVWindz: {behaviour: negligible, measured_in: [AeroDisk, yawed]} + ADVWindzi: {behaviour: negligible, measured_in: [AeroDisk, yawed]} + ADYawErr: {behaviour: negligible, measured_in: [AeroDisk, yawed]} + ANCHTEN1: {behaviour: mooring, measured_in: [MHK buoyancy]} + ANCHTEN2: {behaviour: mooring, measured_in: [MHK buoyancy]} + ANCHTEN3: {behaviour: mooring, measured_in: [MHK buoyancy]} + ANCHTEN4: {behaviour: mooring, measured_in: [MHK buoyancy]} + Azimuth: {behaviour: S, measured_in: [AeroDisk, yawed, AeroDyn nodal outputs, BeamDyn blades, ElastoDyn + AeroDyn, OLAF free wake, Twin-rotor semisubmersible]} + B1AeroPwr: {behaviour: S, measured_in: [ElastoDyn + AeroDyn]} + B1FldFz: {behaviour: S, measured_in: [MHK buoyancy]} + B1N1Alpha: {behaviour: S, measured_in: [BeamDyn blades, ElastoDyn + AeroDyn]} + B1N1Cd: {behaviour: S, measured_in: [ElastoDyn + AeroDyn]} + B1N1Cl: {behaviour: negligible, measured_in: [ElastoDyn + AeroDyn]} + B1N1Cm: {behaviour: negligible, measured_in: [ElastoDyn + AeroDyn]} + B1N1Cn: {behaviour: S, measured_in: [ElastoDyn + AeroDyn]} + B1N1Ct: {behaviour: F, measured_in: [ElastoDyn + AeroDyn]} + B1N1Cx: {behaviour: negligible, measured_in: [ElastoDyn + AeroDyn]} + B1N1Cy: {behaviour: F, measured_in: [ElastoDyn + AeroDyn]} + B1N1Fd: {behaviour: S, measured_in: [ElastoDyn + AeroDyn]} + B1N1Fl: {behaviour: negligible, measured_in: [ElastoDyn + AeroDyn]} + B1N1Fn: {behaviour: S, measured_in: [BeamDyn blades, ElastoDyn + AeroDyn]} + B1N1Ft: {behaviour: F, measured_in: [BeamDyn blades, ElastoDyn + AeroDyn]} + B1N1Fx: {behaviour: negligible, measured_in: [ElastoDyn + AeroDyn]} + B1N1Fy: {behaviour: F, measured_in: [ElastoDyn + AeroDyn]} + B1N1Theta: {behaviour: S, measured_in: [BeamDyn blades, ElastoDyn + AeroDyn]} + B1N1VIndx: {behaviour: S, measured_in: [ElastoDyn + AeroDyn]} + B1N1VIndy: {behaviour: negligible, measured_in: [ElastoDyn + AeroDyn]} + B1N2Alpha: {behaviour: S, measured_in: [BeamDyn blades, ElastoDyn + AeroDyn]} + B1N2Cd: {behaviour: S, measured_in: [ElastoDyn + AeroDyn]} + B1N2Cl: {behaviour: S, measured_in: [ElastoDyn + AeroDyn]} + B1N2Cm: {behaviour: F, measured_in: [ElastoDyn + AeroDyn]} + B1N2Cn: {behaviour: S, measured_in: [ElastoDyn + AeroDyn]} + B1N2Ct: {behaviour: F, measured_in: [ElastoDyn + AeroDyn]} + B1N2Cx: {behaviour: S, measured_in: [ElastoDyn + AeroDyn]} + B1N2Cy: {behaviour: F, measured_in: [ElastoDyn + AeroDyn]} + B1N2Fd: {behaviour: S, measured_in: [ElastoDyn + AeroDyn]} + B1N2Fl: {behaviour: S, measured_in: [ElastoDyn + AeroDyn]} + B1N2Fn: {behaviour: S, measured_in: [BeamDyn blades, ElastoDyn + AeroDyn]} + B1N2Ft: {behaviour: F, measured_in: [BeamDyn blades, ElastoDyn + AeroDyn]} + B1N2Fx: {behaviour: S, measured_in: [ElastoDyn + AeroDyn]} + B1N2Fy: {behaviour: F, measured_in: [ElastoDyn + AeroDyn]} + B1N2Mbn: {behaviour: F, measured_in: [MHK buoyancy]} + B1N2SgCav: {behaviour: S, measured_in: [MHK buoyancy]} + B1N2Theta: {behaviour: S, measured_in: [BeamDyn blades, ElastoDyn + AeroDyn]} + B1N2VIndx: {behaviour: S, measured_in: [ElastoDyn + AeroDyn]} + B1N2VIndy: {behaviour: F, measured_in: [ElastoDyn + AeroDyn]} + B1N3Alpha: {behaviour: S, measured_in: [BeamDyn blades, ElastoDyn + AeroDyn]} + B1N3Cd: {behaviour: S, measured_in: [ElastoDyn + AeroDyn]} + B1N3Cl: {behaviour: S, measured_in: [ElastoDyn + AeroDyn]} + B1N3Clrnc: {behaviour: S, measured_in: [Twin-rotor semisubmersible]} + B1N3Cm: {behaviour: F, measured_in: [ElastoDyn + AeroDyn]} + B1N3Cn: {behaviour: S, measured_in: [ElastoDyn + AeroDyn]} + B1N3Ct: {behaviour: F, measured_in: [ElastoDyn + AeroDyn]} + B1N3Cx: {behaviour: S, measured_in: [ElastoDyn + AeroDyn]} + B1N3Cy: {behaviour: F, measured_in: [ElastoDyn + AeroDyn]} + B1N3Fd: {behaviour: S, measured_in: [ElastoDyn + AeroDyn]} + B1N3Fl: {behaviour: S, measured_in: [ElastoDyn + AeroDyn]} + B1N3Fn: {behaviour: S, measured_in: [BeamDyn blades, ElastoDyn + AeroDyn]} + B1N3Ft: {behaviour: F, measured_in: [BeamDyn blades, ElastoDyn + AeroDyn]} + B1N3Fx: {behaviour: S, measured_in: [ElastoDyn + AeroDyn]} + B1N3Fy: {behaviour: F, measured_in: [ElastoDyn + AeroDyn]} + B1N3SigCr: {behaviour: S, measured_in: [MHK buoyancy]} + B1N3Theta: {behaviour: S, measured_in: [BeamDyn blades, ElastoDyn + AeroDyn]} + B1N3VIndx: {behaviour: S, measured_in: [ElastoDyn + AeroDyn]} + B1N3VIndy: {behaviour: negligible, measured_in: [ElastoDyn + AeroDyn]} + B1N6Mbs: {behaviour: F, measured_in: [MHK buoyancy]} + B1N7Fbt: {behaviour: F, measured_in: [MHK buoyancy]} + B1RootFxr: {behaviour: S, measured_in: [BeamDyn blades]} + B1RootFyr: {behaviour: F, measured_in: [BeamDyn blades]} + B1RootFzr: {behaviour: S, measured_in: [BeamDyn blades]} + B1RootMxr: {behaviour: F, measured_in: [BeamDyn blades]} + B1RootMyr: {behaviour: S, measured_in: [BeamDyn blades]} + B1RootMzr: {behaviour: F, measured_in: [BeamDyn blades]} + B1TipRDxr: {behaviour: F, measured_in: [BeamDyn blades]} + B1TipRDyr: {behaviour: S, measured_in: [BeamDyn blades]} + B1TipRDzr: {behaviour: F, measured_in: [BeamDyn blades]} + B1TipTDxr: {behaviour: S, measured_in: [BeamDyn blades]} + B1TipTDyr: {behaviour: F, measured_in: [BeamDyn blades]} + B1TipTDzr: {behaviour: S, measured_in: [BeamDyn blades]} + B2AeroPwr: {behaviour: S, measured_in: [ElastoDyn + AeroDyn]} + B2FldMx: {behaviour: F, measured_in: [MHK buoyancy]} + B2N3Clrnc: {behaviour: S, measured_in: [Twin-rotor semisubmersible]} + B2N3Mbt: {behaviour: S, measured_in: [MHK buoyancy]} + B2N4Fbn: {behaviour: S, measured_in: [MHK buoyancy]} + B2N5SigCr: {behaviour: S, measured_in: [MHK buoyancy]} + B2N6SgCav: {behaviour: S, measured_in: [MHK buoyancy]} + B2N8Fbs: {behaviour: S, measured_in: [MHK buoyancy]} + B2RootFxr: {behaviour: S, measured_in: [BeamDyn blades]} + B2RootFyr: {behaviour: F, measured_in: [BeamDyn blades]} + B2RootFzr: {behaviour: S, measured_in: [BeamDyn blades]} + B2RootMxr: {behaviour: F, measured_in: [BeamDyn blades]} + B2RootMyr: {behaviour: S, measured_in: [BeamDyn blades]} + B2RootMzr: {behaviour: F, measured_in: [BeamDyn blades]} + B2TipRDxr: {behaviour: F, measured_in: [BeamDyn blades]} + B2TipRDyr: {behaviour: S, measured_in: [BeamDyn blades]} + B2TipRDzr: {behaviour: F, measured_in: [BeamDyn blades]} + B2TipTDxr: {behaviour: S, measured_in: [BeamDyn blades]} + B2TipTDyr: {behaviour: F, measured_in: [BeamDyn blades]} + B2TipTDzr: {behaviour: S, measured_in: [BeamDyn blades]} + B3AeroPwr: {behaviour: S, measured_in: [ElastoDyn + AeroDyn]} + B3N3Clrnc: {behaviour: S, measured_in: [Twin-rotor semisubmersible]} + B3RootFxr: {behaviour: S, measured_in: [BeamDyn blades]} + B3RootFyr: {behaviour: F, measured_in: [BeamDyn blades]} + B3RootFzr: {behaviour: S, measured_in: [BeamDyn blades]} + B3RootMxr: {behaviour: F, measured_in: [BeamDyn blades]} + B3RootMyr: {behaviour: S, measured_in: [BeamDyn blades]} + B3RootMzr: {behaviour: F, measured_in: [BeamDyn blades]} + B3TipRDxr: {behaviour: F, measured_in: [BeamDyn blades]} + B3TipRDyr: {behaviour: S, measured_in: [BeamDyn blades]} + B3TipRDzr: {behaviour: F, measured_in: [BeamDyn blades]} + B3TipTDxr: {behaviour: S, measured_in: [BeamDyn blades]} + B3TipTDyr: {behaviour: F, measured_in: [BeamDyn blades]} + B3TipTDzr: {behaviour: S, measured_in: [BeamDyn blades]} + BldPitch1: {behaviour: negligible, measured_in: [AeroDyn nodal outputs, OLAF free wake, Twin-rotor semisubmersible]} + BldPitch2: {behaviour: negligible, measured_in: [AeroDyn nodal outputs]} + BldPitch3: {behaviour: negligible, measured_in: [AeroDyn nodal outputs]} + BlPitch1: {behaviour: negligible, measured_in: [AeroDisk, yawed]} + BlPitch2: {behaviour: negligible, measured_in: [AeroDisk, yawed]} + BlPitch3: {behaviour: negligible, measured_in: [AeroDisk, yawed]} + Case: {behaviour: S, measured_in: [AeroDyn nodal outputs, OLAF free wake]} + CON10PX: {behaviour: mooring, measured_in: [MHK buoyancy]} + CON10PY: {behaviour: mooring, measured_in: [MHK buoyancy]} + CON10PZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + CON11PX: {behaviour: mooring, measured_in: [MHK buoyancy]} + CON11PY: {behaviour: mooring, measured_in: [MHK buoyancy]} + CON11PZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + CON1FX: {behaviour: mooring, measured_in: [MHK buoyancy]} + CON1FY: {behaviour: mooring, measured_in: [MHK buoyancy]} + CON1FZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + CON2FX: {behaviour: mooring, measured_in: [MHK buoyancy]} + CON2FY: {behaviour: mooring, measured_in: [MHK buoyancy]} + CON2FZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + CON3FX: {behaviour: mooring, measured_in: [MHK buoyancy]} + CON3FY: {behaviour: mooring, measured_in: [MHK buoyancy]} + CON3FZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + CON4FX: {behaviour: mooring, measured_in: [MHK buoyancy]} + CON4FY: {behaviour: mooring, measured_in: [MHK buoyancy]} + CON4FZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + CON5FX: {behaviour: mooring, measured_in: [MHK buoyancy]} + CON5FY: {behaviour: mooring, measured_in: [MHK buoyancy]} + CON5FZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + CON5PX: {behaviour: mooring, measured_in: [MHK buoyancy]} + CON5PY: {behaviour: mooring, measured_in: [MHK buoyancy]} + CON5PZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + CON6FX: {behaviour: mooring, measured_in: [MHK buoyancy]} + CON6FY: {behaviour: mooring, measured_in: [MHK buoyancy]} + CON6FZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + CON6PX: {behaviour: mooring, measured_in: [MHK buoyancy]} + CON6PY: {behaviour: mooring, measured_in: [MHK buoyancy]} + CON6PZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + CON7FX: {behaviour: mooring, measured_in: [MHK buoyancy]} + CON7FY: {behaviour: mooring, measured_in: [MHK buoyancy]} + CON7FZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + CON7PX: {behaviour: mooring, measured_in: [MHK buoyancy]} + CON7PY: {behaviour: mooring, measured_in: [MHK buoyancy]} + CON7PZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + CON8FX: {behaviour: mooring, measured_in: [MHK buoyancy]} + CON8FY: {behaviour: mooring, measured_in: [MHK buoyancy]} + CON8FZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + CON8PX: {behaviour: mooring, measured_in: [MHK buoyancy]} + CON8PY: {behaviour: mooring, measured_in: [MHK buoyancy]} + CON8PZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + CON9PX: {behaviour: mooring, measured_in: [MHK buoyancy]} + CON9PY: {behaviour: mooring, measured_in: [MHK buoyancy]} + CON9PZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + FAIRTEN1: {behaviour: mooring, measured_in: [MHK buoyancy]} + FAIRTEN2: {behaviour: mooring, measured_in: [MHK buoyancy]} + FAIRTEN3: {behaviour: mooring, measured_in: [MHK buoyancy]} + FAIRTEN4: {behaviour: mooring, measured_in: [MHK buoyancy]} + GenAcc: {behaviour: negligible, measured_in: [AeroDisk, yawed]} + GenAccel: {behaviour: S, measured_in: [BeamDyn blades, ElastoDyn + AeroDyn]} + GenPwr: {behaviour: S, measured_in: [Twin-rotor semisubmersible]} + GenSpeed: {behaviour: S, measured_in: [AeroDisk, yawed, BeamDyn blades, ElastoDyn + AeroDyn, Twin-rotor semisubmersible]} + GenTq: {behaviour: S, measured_in: [Twin-rotor semisubmersible]} + HbFbx: {behaviour: S, measured_in: [MHK buoyancy]} + HbFby: {behaviour: F, measured_in: [MHK buoyancy]} + HbFbz: {behaviour: S, measured_in: [MHK buoyancy]} + HbMbx: {behaviour: F, measured_in: [MHK buoyancy]} + HbMby: {behaviour: S, measured_in: [MHK buoyancy]} + HbMbz: {behaviour: F, measured_in: [MHK buoyancy]} + HSShftPwr: {behaviour: S, measured_in: [BeamDyn blades, ElastoDyn + AeroDyn]} + HSShftTq: {behaviour: S, measured_in: [BeamDyn blades, ElastoDyn + AeroDyn]} + HWindSpeedX: {behaviour: S, measured_in: [AeroDyn nodal outputs, OLAF free wake]} + HWindSpeedY: {behaviour: negligible, measured_in: [AeroDyn nodal outputs, OLAF free wake]} + HWindSpeedZ: {behaviour: negligible, measured_in: [AeroDyn nodal outputs, OLAF free wake]} + HydroFxi: {behaviour: S, measured_in: [MHK buoyancy]} + HydroFyi: {behaviour: F, measured_in: [MHK buoyancy]} + HydroFzi: {behaviour: S, measured_in: [MHK buoyancy]} + IPDefl1: {behaviour: F, measured_in: [BeamDyn blades, ElastoDyn + AeroDyn, Twin-rotor semisubmersible]} + IPDefl2: {behaviour: F, measured_in: [BeamDyn blades, ElastoDyn + AeroDyn]} + IPDefl3: {behaviour: F, measured_in: [BeamDyn blades, ElastoDyn + AeroDyn]} + L1N10PZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + L1N11PZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + L1N12PZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + L1N13PZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + L1N14PZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + L1N15PZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + L1N16PZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + L1N17PZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + L1N18PZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + L1N19PZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + L1N1PZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + L1N20PZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + L1N21PZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + L1N22PZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + L1N23PZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + L1N24PZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + L1N25PZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + L1N26PZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + L1N27PZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + L1N28PZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + L1N29PZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + L1N2PZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + L1N30PZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + L1N31PZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + L1N32PZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + L1N33PZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + L1N34PZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + L1N35PZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + L1N36PZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + L1N37PZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + L1N38PZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + L1N39PZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + L1N3PZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + L1N40PZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + L1N4PZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + L1N5PZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + L1N6PZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + L1N7PZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + L1N8PZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + L1N9PZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + L3N10PZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + L3N11PZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + L3N12PZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + L3N13PZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + L3N14PZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + L3N15PZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + L3N16PZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + L3N17PZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + L3N18PZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + L3N19PZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + L3N1PZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + L3N20PZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + L3N21PZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + L3N22PZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + L3N23PZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + L3N24PZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + L3N25PZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + L3N26PZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + L3N27PZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + L3N28PZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + L3N29PZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + L3N2PZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + L3N30PZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + L3N31PZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + L3N32PZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + L3N33PZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + L3N34PZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + L3N35PZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + L3N36PZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + L3N37PZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + L3N38PZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + L3N39PZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + L3N3PZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + L3N40PZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + L3N4PZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + L3N5PZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + L3N6PZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + L3N7PZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + L3N8PZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + L3N9PZ: {behaviour: mooring, measured_in: [MHK buoyancy]} + LSSGagMxa: {behaviour: F, measured_in: [BeamDyn blades, ElastoDyn + AeroDyn]} + LSSGagMya: {behaviour: S, measured_in: [Twin-rotor semisubmersible]} + LSSGagMza: {behaviour: F, measured_in: [Twin-rotor semisubmersible]} + LSShftFxa: {behaviour: S, measured_in: [BeamDyn blades, ElastoDyn + AeroDyn]} + LSShftFya: {behaviour: F, measured_in: [BeamDyn blades, ElastoDyn + AeroDyn]} + LSShftFza: {behaviour: S, measured_in: [BeamDyn blades, ElastoDyn + AeroDyn]} + LSShftMxa: {behaviour: F, measured_in: [BeamDyn blades, ElastoDyn + AeroDyn]} + LSShftTq: {behaviour: S, measured_in: [BeamDyn blades, ElastoDyn + AeroDyn]} + LSSTipAxa: {behaviour: F, measured_in: [BeamDyn blades, ElastoDyn + AeroDyn]} + LSSTipMya: {behaviour: S, measured_in: [BeamDyn blades, ElastoDyn + AeroDyn]} + LSSTipMza: {behaviour: F, measured_in: [BeamDyn blades, ElastoDyn + AeroDyn]} + LSSTipPxa: {behaviour: A, measured_in: [BeamDyn blades, ElastoDyn + AeroDyn]} + LSSTipVxa: {behaviour: F, measured_in: [BeamDyn blades, ElastoDyn + AeroDyn]} + NcFbx: {behaviour: negligible, measured_in: [MHK buoyancy]} + NcFby: {behaviour: negligible, measured_in: [MHK buoyancy]} + NcFbz: {behaviour: negligible, measured_in: [MHK buoyancy]} + NcIMUTAxs: {behaviour: S, measured_in: [Twin-rotor semisubmersible]} + NcIMUTAys: {behaviour: F, measured_in: [Twin-rotor semisubmersible]} + NcIMUTAzs: {behaviour: S, measured_in: [Twin-rotor semisubmersible]} + NcMbx: {behaviour: negligible, measured_in: [MHK buoyancy]} + NcMby: {behaviour: negligible, measured_in: [MHK buoyancy]} + NcMbz: {behaviour: negligible, measured_in: [MHK buoyancy]} + OoPDefl1: {behaviour: S, measured_in: [BeamDyn blades, ElastoDyn + AeroDyn, MHK buoyancy, Twin-rotor semisubmersible]} + OoPDefl2: {behaviour: S, measured_in: [BeamDyn blades, ElastoDyn + AeroDyn]} + OoPDefl3: {behaviour: S, measured_in: [BeamDyn blades, ElastoDyn + AeroDyn]} + PtfmHeave: {behaviour: S, measured_in: [AeroDyn nodal outputs, MHK buoyancy, OLAF free wake, Twin-rotor semisubmersible]} + PtfmPitch: {behaviour: S, measured_in: [AeroDyn nodal outputs, MHK buoyancy, OLAF free wake, Twin-rotor semisubmersible]} + PtfmRoll: {behaviour: F, measured_in: [AeroDyn nodal outputs, MHK buoyancy, OLAF free wake, Twin-rotor semisubmersible]} + PtfmSurge: {behaviour: S, measured_in: [AeroDyn nodal outputs, MHK buoyancy, OLAF free wake, Twin-rotor semisubmersible]} + PtfmSway: {behaviour: F, measured_in: [AeroDyn nodal outputs, MHK buoyancy, OLAF free wake, Twin-rotor semisubmersible]} + PtfmYaw: {behaviour: F, measured_in: [AeroDyn nodal outputs, MHK buoyancy, OLAF free wake, Twin-rotor semisubmersible]} + RootFxb1: {behaviour: S, measured_in: [Twin-rotor semisubmersible]} + RootFxc1: {behaviour: S, measured_in: [BeamDyn blades, ElastoDyn + AeroDyn, Twin-rotor semisubmersible]} + RootFyb1: {behaviour: F, measured_in: [Twin-rotor semisubmersible]} + RootFyc1: {behaviour: F, measured_in: [BeamDyn blades, ElastoDyn + AeroDyn, Twin-rotor semisubmersible]} + RootFzb1: {behaviour: S, measured_in: [Twin-rotor semisubmersible]} + RootFzc1: {behaviour: S, measured_in: [Twin-rotor semisubmersible]} + RootMxb1: {behaviour: F, measured_in: [Twin-rotor semisubmersible]} + RootMxc1: {behaviour: F, measured_in: [BeamDyn blades, ElastoDyn + AeroDyn, Twin-rotor semisubmersible]} + RootMxc2: {behaviour: F, measured_in: [BeamDyn blades, ElastoDyn + AeroDyn]} + RootMxc3: {behaviour: F, measured_in: [BeamDyn blades, ElastoDyn + AeroDyn]} + RootMyb1: {behaviour: S, measured_in: [Twin-rotor semisubmersible]} + RootMyc1: {behaviour: S, measured_in: [BeamDyn blades, ElastoDyn + AeroDyn, Twin-rotor semisubmersible]} + RootMyc2: {behaviour: S, measured_in: [BeamDyn blades, ElastoDyn + AeroDyn]} + RootMyc3: {behaviour: S, measured_in: [BeamDyn blades, ElastoDyn + AeroDyn]} + RootMzb1: {behaviour: F, measured_in: [Twin-rotor semisubmersible]} + RootMzc1: {behaviour: F, measured_in: [BeamDyn blades, ElastoDyn + AeroDyn, Twin-rotor semisubmersible]} + RotAcc: {behaviour: negligible, measured_in: [AeroDisk, yawed]} + RotAccel: {behaviour: S, measured_in: [BeamDyn blades, ElastoDyn + AeroDyn]} + RotPwr: {behaviour: S, measured_in: [AeroDisk, yawed, BeamDyn blades, ElastoDyn + AeroDyn]} + RotSpeed: {behaviour: S, measured_in: [AeroDisk, yawed, AeroDyn nodal outputs, BeamDyn blades, ElastoDyn + AeroDyn, OLAF free wake, Twin-rotor semisubmersible]} + RotThrust: {behaviour: S, measured_in: [BeamDyn blades, ElastoDyn + AeroDyn]} + RotTorq: {behaviour: S, measured_in: [AeroDisk, yawed, BeamDyn blades, ElastoDyn + AeroDyn, Twin-rotor semisubmersible]} + RtAeroCp: {behaviour: S, measured_in: [AeroDyn nodal outputs, ElastoDyn + AeroDyn]} + RtAeroCq: {behaviour: F, measured_in: [AeroDyn nodal outputs, ElastoDyn + AeroDyn]} + RtAeroCt: {behaviour: S, measured_in: [AeroDyn nodal outputs, ElastoDyn + AeroDyn]} + RtAeroFxh: {behaviour: S, measured_in: [AeroDyn nodal outputs, BeamDyn blades, ElastoDyn + AeroDyn, Twin-rotor semisubmersible]} + RtAeroFyh: {behaviour: F, measured_in: [AeroDyn nodal outputs, ElastoDyn + AeroDyn, Twin-rotor semisubmersible]} + RtAeroFzh: {behaviour: S, measured_in: [AeroDyn nodal outputs, ElastoDyn + AeroDyn, Twin-rotor semisubmersible]} + RtAeroMxh: {behaviour: F, measured_in: [BeamDyn blades, ElastoDyn + AeroDyn, Twin-rotor semisubmersible]} + RtAeroMyh: {behaviour: S, measured_in: [AeroDyn nodal outputs, ElastoDyn + AeroDyn, Twin-rotor semisubmersible]} + RtAeroMzh: {behaviour: F, measured_in: [ElastoDyn + AeroDyn, Twin-rotor semisubmersible]} + RtAeroPwr: {behaviour: S, measured_in: [AeroDyn nodal outputs, BeamDyn blades, ElastoDyn + AeroDyn]} + RtArea: {behaviour: S, measured_in: [AeroDyn nodal outputs, Twin-rotor semisubmersible]} + RtFldFxh: {behaviour: S, measured_in: [MHK buoyancy]} + RtFldFyh: {behaviour: F, measured_in: [MHK buoyancy]} + RtFldFzg: {behaviour: S, measured_in: [MHK buoyancy]} + RtFldMxh: {behaviour: F, measured_in: [MHK buoyancy]} + RtFldMyg: {behaviour: S, measured_in: [MHK buoyancy]} + RtFldMzh: {behaviour: F, measured_in: [MHK buoyancy]} + RtSkew: {behaviour: S, measured_in: [AeroDyn nodal outputs, BeamDyn blades, ElastoDyn + AeroDyn]} + RtSpeed: {behaviour: S, measured_in: [AeroDyn nodal outputs, ElastoDyn + AeroDyn]} + RtTSR: {behaviour: S, measured_in: [AeroDyn nodal outputs, BeamDyn blades, ElastoDyn + AeroDyn]} + RtVAvgxh: {behaviour: S, measured_in: [AeroDyn nodal outputs, Twin-rotor semisubmersible]} + RtVAvgyh: {behaviour: F, measured_in: [AeroDyn nodal outputs]} + RtVAvgzh: {behaviour: S, measured_in: [AeroDyn nodal outputs]} + ShearExp: {behaviour: S, measured_in: [AeroDyn nodal outputs, OLAF free wake]} + Time: {behaviour: S, measured_in: [AeroDisk, yawed, AeroDyn nodal outputs, BeamDyn blades, ElastoDyn + AeroDyn, MHK buoyancy, OLAF free wake]} + TipDxc1: {behaviour: S, measured_in: [BeamDyn blades, ElastoDyn + AeroDyn]} + TipDyc1: {behaviour: F, measured_in: [BeamDyn blades, ElastoDyn + AeroDyn]} + TTDspFA: {behaviour: S, measured_in: [Twin-rotor semisubmersible]} + TTDspSS: {behaviour: F, measured_in: [Twin-rotor semisubmersible]} + TTDspTwst: {behaviour: negligible, measured_in: [Twin-rotor semisubmersible]} + TwN1Fbx: {behaviour: negligible, measured_in: [MHK buoyancy]} + TwN1Mbx: {behaviour: negligible, measured_in: [MHK buoyancy]} + TwN2Mby: {behaviour: negligible, measured_in: [MHK buoyancy]} + TwN3Fby: {behaviour: negligible, measured_in: [MHK buoyancy]} + TwN3Mbz: {behaviour: negligible, measured_in: [MHK buoyancy]} + TwN4Fbz: {behaviour: negligible, measured_in: [MHK buoyancy]} + TwrBsFxt: {behaviour: S, measured_in: [BeamDyn blades, ElastoDyn + AeroDyn, Twin-rotor semisubmersible]} + TwrBsFyt: {behaviour: F, measured_in: [BeamDyn blades, ElastoDyn + AeroDyn, Twin-rotor semisubmersible]} + TwrBsFzt: {behaviour: S, measured_in: [Twin-rotor semisubmersible]} + TwrBsMxt: {behaviour: F, measured_in: [BeamDyn blades, ElastoDyn + AeroDyn, Twin-rotor semisubmersible]} + TwrBsMyt: {behaviour: S, measured_in: [BeamDyn blades, ElastoDyn + AeroDyn, Twin-rotor semisubmersible]} + TwrBsMzt: {behaviour: F, measured_in: [BeamDyn blades, ElastoDyn + AeroDyn, Twin-rotor semisubmersible]} + TwrTpTDxi: {behaviour: S, measured_in: [MHK buoyancy]} + TwrTpTDyi: {behaviour: F, measured_in: [MHK buoyancy]} + TwrTpTDzi: {behaviour: S, measured_in: [MHK buoyancy]} + TwstDefl1: {behaviour: negligible, measured_in: [Twin-rotor semisubmersible]} + Wave1Elev: {behaviour: S, measured_in: [MHK buoyancy]} + Wind1VelX: {behaviour: S, measured_in: [AeroDisk, yawed, AeroDyn nodal outputs, BeamDyn blades, ElastoDyn + AeroDyn]} + Wind1VelY: {behaviour: negligible, measured_in: [AeroDisk, yawed, AeroDyn nodal outputs, BeamDyn blades, ElastoDyn + AeroDyn]} + Wind1VelZ: {behaviour: negligible, measured_in: [AeroDisk, yawed, AeroDyn nodal outputs, BeamDyn blades, ElastoDyn + AeroDyn]} + Yaw: {behaviour: F, measured_in: [AeroDisk, yawed, AeroDyn nodal outputs, OLAF free wake]} + YawBrFxp: {behaviour: S, measured_in: [BeamDyn blades, ElastoDyn + AeroDyn, Twin-rotor semisubmersible]} + YawBrFyp: {behaviour: F, measured_in: [BeamDyn blades, ElastoDyn + AeroDyn, Twin-rotor semisubmersible]} + YawBrFzp: {behaviour: S, measured_in: [BeamDyn blades, ElastoDyn + AeroDyn, Twin-rotor semisubmersible]} + YawBrMxp: {behaviour: F, measured_in: [BeamDyn blades, ElastoDyn + AeroDyn, Twin-rotor semisubmersible]} + YawBrMyp: {behaviour: S, measured_in: [BeamDyn blades, ElastoDyn + AeroDyn, Twin-rotor semisubmersible]} + YawBrMzp: {behaviour: F, measured_in: [BeamDyn blades, ElastoDyn + AeroDyn, Twin-rotor semisubmersible]} + YawRate: {behaviour: negligible, measured_in: [AeroDisk, yawed]} diff --git a/reg_tests/otherTests/emit_sign_table.py b/reg_tests/otherTests/emit_sign_table.py index 0d8d244693..80804ea7ba 100644 --- a/reg_tests/otherTests/emit_sign_table.py +++ b/reg_tests/otherTests/emit_sign_table.py @@ -94,11 +94,137 @@ def measure(a, na, b, nb, nblades, tol, floor): return out + +# The behaviour codes, in the order they are presented everywhere else. +BEHAVIOUR = ( + ("S", "identical", "v' = v"), + ("F", "sign-flipped", "v' = -v"), + ("A", "mirrored angle", "v' = -v, wrapped"), + ("negligible", "below the noise floor", "indistinguishable from zero everywhere"), + ("?", "unresolved", "measured but not classified"), +) + + +def emit_map(groups, mooring, origin, conflicts, tol, floor): + """Write the per-channel sign map into docs/source. + + Two artefacts from one measurement: a YAML file for anything that wants to + consume the map, and a reStructuredText page that renders it for a reader. + Both are generated -- neither should be hand-edited, because the map is + measured on every run and a hand edit would be silently overwritten or, + worse, silently disagree with what the code actually does. + """ + docs = os.path.join(REPO_ROOT, "docs", "source", "user", "glue-code") + labels = {k: lbl for k, lbl, _ in BEHAVIOUR} + + rows = [] + for k, lbl, _ in BEHAVIOUR: + for n in sorted(groups.get(k, [])): + rows.append((n, k, lbl, sorted(origin[n]))) + for n in sorted(mooring): + rows.append((n, "mooring", "set aside, layout-specific", + sorted(origin[n]))) + rows.sort(key=lambda r: r[0].upper()) + + yml = os.path.join(docs, "mirror_rotor_sign_map.yaml") + with open(yml, "w") as fh: + fh.write("# Measured mirror sign map -- GENERATED, do not edit by hand.\n") + fh.write("# Regenerate with:\n") + fh.write("# python3 reg_tests/otherTests/emit_sign_table.py " + f"--tol {tol} --emit-map\n") + fh.write("#\n") + fh.write("# Every entry is observed by running a registered clockwise/mirrored\n") + fh.write("# pair and comparing the channel against its counterpart. Nothing here\n") + fh.write("# is inferred from reading the source.\n") + fh.write(f"tolerance: {tol}\n") + fh.write(f"noise_floor: {floor}\n") + fh.write("behaviours:\n") + for k, lbl, meaning in BEHAVIOUR: + # "?" is a YAML indicator character; quote the key so every parser + # reads it as the scalar it is meant to be. + key = f'"{k}"' if k == "?" else k + fh.write(f' {key}: {{name: "{lbl}", meaning: "{meaning}"}}\n') + fh.write(' mooring: {name: "set aside", ' + 'meaning: "pairing is layout-specific"}\n') + fh.write("channels:\n") + for n, k, lbl, src in rows: + fh.write(f' {n}: {{behaviour: {k}, measured_in: [{", ".join(src)}]}}\n') + + rst = os.path.join(docs, "mirror_rotor_sign_map.rst") + with open(rst, "w") as fh: + fh.write(""".. _glue-code-mirror-rotor-sign-map: + +Mirror-rotor sign map +===================== + +.. warning:: + This page is **generated**. Do not edit it by hand; regenerate it with + + .. code-block:: bash + + python3 reg_tests/otherTests/emit_sign_table.py --tol """ + str(tol) + """ --emit-map + +Every entry below is **measured**, not asserted. Each registered +clockwise/mirrored pair is run and every output channel is compared against its +counterpart, so this records behaviour that is observed rather than behaviour +expected from reading the source. A channel seen in more than one pair must +agree across them; a disagreement is reported rather than silently resolved. + +The grouped, prose form of the same information is in +:ref:`glue-code-mirror-rotor-verification`, which is the better place to start. +This page exists for looking a single channel up, and for anything that wants to +consume the map as data -- see ``mirror_rotor_sign_map.yaml`` beside this file. + +**Read it correctly.** This records how the two runs of a *symmetric* comparison +relate to each other, which is how the implementation is verified. It is **not** +a claim that these channels change sign whenever the flag is set: in an ordinary +simulation the tower, support structure and inflow are not mirrored, so a +quantity such as ``TwrBsMxt`` is simply the response of an unchanged structure to +a counter-clockwise rotor. + +Blade 1 lies on the mirror plane and blades 2 and 3 exchange, so a mirrored +blade 2 is compared against the clockwise blade 3. Mooring channels are set +aside because which line pairs with which depends on the layout. + +""") + fh.write(f"Measured at a relative tolerance of ``{tol}`` with a noise floor of " + f"``{floor}``, across {len(rows)} channels.\n\n") + for k, lbl, meaning in BEHAVIOUR: + n = len(groups.get(k, [])) + if n: + fh.write(f"* **{lbl}** ({n}) -- {meaning}\n") + fh.write(f"* **set aside** ({len(mooring)}) -- mooring, pairing is " + "layout-specific\n\n") + if conflicts: + fh.write(".. warning::\n Channels observed behaving differently in " + "different pairs:\n\n") + for n, cl, src in conflicts: + fh.write(f" * ``{n}``: {cl}, seen in {src}\n") + fh.write("\n") + fh.write(""".. list-table:: + :header-rows: 1 + :widths: 30 25 45 + + * - Channel + - Behaviour + - Measured in +""") + for n, k, lbl, src in rows: + fh.write(f" * - ``{n}``\n - {lbl}\n - {', '.join(src)}\n") + + print(f"\nwrote {yml}") + print(f"wrote {rst}") + print(f" {len(rows)} channels") + + def main(): ap = argparse.ArgumentParser() ap.add_argument("--tol", type=float, default=2e-3) ap.add_argument("--floor", type=float, default=1e-8) ap.add_argument("--show-unresolved", action="store_true") + ap.add_argument("--emit-map", action="store_true", + help="write the per-channel sign map into docs/source as YAML " + "and as a reStructuredText table") a = ap.parse_args() seen = defaultdict(set) @@ -197,6 +323,9 @@ def main(): print(f"\n=== {lbl}") print(" " + ", ".join(groups[k])) + if a.emit_map: + emit_map(groups, mooring, origin, conflicts, a.tol, a.floor) + if __name__ == "__main__": main() From 00a082ad3dc2d09c37d4ae36fb53388498a4ad00 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Tue, 29 Sep 2026 15:15:02 -0600 Subject: [PATCH 59/66] Bump r-test for the deck fixes after the dev merge Points r-test at the commit that closes the input deck gaps the dev merge opened: the ten AeroDyn primary files and three OLAF files private to this branch's clockwise and mirrored cases gain the generalised support structure and RegFunctionPart lines that dev now requires, and the six driver decks of dev's three new cases gain the MirrorRotor(x) line this branch requires. Every inserted line is copied verbatim from the corresponding upstream-updated parent deck with the features disabled, so no physics changes and no baseline moves. This addresses all 13 regression failures on the pull request CI run. Assisted-by: Claude Fable 5 Assisted-by: Claude Sonnet 5 --- 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 5e6de583cc..6e5bf8fec1 160000 --- a/reg_tests/r-test +++ b/reg_tests/r-test @@ -1 +1 @@ -Subproject commit 5e6de583ccb0c69147171f0696f398da4345b350 +Subproject commit 6e5bf8fec1de7688fe128f437fc2db8aa93edf22 From 691fd8f6e7cf7c026543c67a865e859c93cb177a Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Tue, 29 Sep 2026 19:24:54 -0600 Subject: [PATCH 60/66] Update 5MW_MRSemi_DLL_WSt_WavesIrr_MirrorRotor baseline --- 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 6e5bf8fec1..fd874f803a 160000 --- a/reg_tests/r-test +++ b/reg_tests/r-test @@ -1 +1 @@ -Subproject commit 6e5bf8fec1de7688fe128f437fc2db8aa93edf22 +Subproject commit fd874f803a18a96b94e5d7e4bd0bec7bba1fae76 From bfd57d2ba753316d80a91fcdd7932371d96f9d6e Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Wed, 30 Sep 2026 09:07:03 -0600 Subject: [PATCH 61/66] Number the blades in the direction of rotation for a mirrored rotor Until now a mirrored rotor kept the clockwise blade spacing, so its blade k sat at +(k-1)*2pi/N in the inertial sense while the rotor turned the other way, and every comparison between a clockwise and a mirrored rotor had to exchange blades 2 and 3 (D-Q7c). The spacing now carries RotDir in the three places that compute blade placement from the blade index: SetCoordSy's gRotAng in ElastoDyn, Init_Mesh's RootAz in Simplified ElastoDyn, and the basic HAWT format of the AeroDyn driver. Everything else - BeamDyn, AeroDyn inside OpenFAST, the free wake, the VTK output - follows the blade root meshes and renumbers with them; the driver's advanced format takes the blade orientations as given, so the user supplies mirrored azimuths there. Mirrored blade k is thereby the mirror image of clockwise blade k, and the blades pass a fixed azimuth in numeric order for either rotation sense: measured from the AD BAzimuth channels, blade spacing from blade 1 reads +120 and +240 degrees in the rotor's own convention for both a clockwise and a mirrored rotor, where the old convention read 240 and 120 on the mirrored one. This also makes ServoDyn's cosine flap schedule and a Bladed DLL's own blade offsets, both of which assume even spacing in the rotation direction, correct for a mirrored rotor with no ServoDyn change. Every factor is RotDir, exactly +1.0 for a clockwise rotor: the regenerated clockwise steady baseline moved no common channel beyond 1e-4 of range, and the seventeen mirrorrotor regression cases pass against baselines that move only in B2- and B3-indexed channels. A two-bladed rotor places blade 2 at -pi instead of +pi, the same position to round-off, and the AWT teeter case passes unchanged. Assisted-by: Claude Fable 5 --- modules/aerodyn/src/AeroDyn_Driver_Subs.f90 | 10 ++++++++-- modules/elastodyn/src/ElastoDyn.f90 | 4 +++- modules/simple-elastodyn/src/SED.f90 | 5 +++-- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/modules/aerodyn/src/AeroDyn_Driver_Subs.f90 b/modules/aerodyn/src/AeroDyn_Driver_Subs.f90 index d5c0c08ae7..20220bf6d9 100644 --- a/modules/aerodyn/src/AeroDyn_Driver_Subs.f90 +++ b/modules/aerodyn/src/AeroDyn_Driver_Subs.f90 @@ -992,6 +992,7 @@ subroutine Dvr_ReadInputFile(fileName, dvr, errStat, errMsg ) ! Basic inputs real(ReKi) :: hubRad, hubHt, overhang, shftTilt, precone, twr2Shft ! Basic inputs when basicHAWTFormat is true real(ReKi) :: nacYaw, bldPitch, rotSpeed + real(ReKi) :: rotDirDvr ! +1 normal, -1 when the rotor rotation is mirrored errStat = ErrID_None errMsg = '' UnIn = -1 @@ -1114,12 +1115,17 @@ subroutine Dvr_ReadInputFile(fileName, dvr, errStat, errMsg ) wt%hub%origin_n = (/ overhang * cos(shftTilt), 0.0_ReKi, -overhang * sin(shftTilt) + twr2shft /) ! IDEM wt%hub%orientation_n = (/ 0.0_ReKi, shftTilt, 0.0_ReKi /) - ! blades + ! blades. The azimuth spacing carries the rotation sense, so the blades are + ! numbered in the direction of rotation for a mirrored rotor as well as a + ! clockwise one. The advanced format takes BldOrientation_h as given, so the + ! user supplies mirrored azimuths there themselves. + rotDirDvr = 1.0_ReKi + if (wt%MirrorRotor) rotDirDvr = -1.0_ReKi allocate(wt%bld(wt%numBlades)) do iB=1,wt%numBlades wt%bld(iB)%pitch = myNaN wt%bld(iB)%origin_h(1:3) = 0.0_ReKi - wt%bld(iB)%orientation_h(1) = (iB-1)*(2._ReKi*Pi)/wt%numBlades + wt%bld(iB)%orientation_h(1) = rotDirDvr*(iB-1)*(2._ReKi*Pi)/wt%numBlades wt%bld(iB)%orientation_h(2) = precone wt%bld(iB)%orientation_h(3) = 0.0_ReKi wt%bld(iB)%hubRad_bl = hubRad diff --git a/modules/elastodyn/src/ElastoDyn.f90 b/modules/elastodyn/src/ElastoDyn.f90 index 5f8ce05a66..27236a34a1 100644 --- a/modules/elastodyn/src/ElastoDyn.f90 +++ b/modules/elastodyn/src/ElastoDyn.f90 @@ -6265,8 +6265,10 @@ SUBROUTINE SetCoordSy( t, CoordSys, RtHSdat, BlPitch, p, x, ErrStat, ErrMsg ) ! Hub (Prime) coordinate system rotated to match blade K. + ! The spacing carries the rotation sense, so the blades are numbered in the + ! direction of rotation for a mirrored rotor as well as a clockwise one. - gRotAng = p%TwoPiNB*(K-1) + gRotAng = REAL(p%RotDir,R8Ki)*p%TwoPiNB*(K-1) CgRotAng = COS( gRotAng ) SgRotAng = SIN( gRotAng ) diff --git a/modules/simple-elastodyn/src/SED.f90 b/modules/simple-elastodyn/src/SED.f90 index 4233729f97..41097fbe0c 100644 --- a/modules/simple-elastodyn/src/SED.f90 +++ b/modules/simple-elastodyn/src/SED.f90 @@ -404,8 +404,9 @@ subroutine Init_Mesh(ErrStat3,ErrMSg3) ! apply to ref orientation of hub Orient = matmul(y%HubPtMotion%RefOrientation(1:3,1:3,1),transpose(R33b)) - ! now apply azimuth rotation about hub X - RootAz = real((i-1),R8Ki) * TwoPi_R8 / real(p%NumBl,R8Ki) + ! now apply azimuth rotation about hub X. The spacing carries the rotation + ! sense, so the blades are numbered in the direction of rotation. + RootAz = real(p%RotDir,R8Ki) * real((i-1),R8Ki) * TwoPi_R8 / real(p%NumBl,R8Ki) R33c(1:3,1:3) = SkewSymMat( y%HubPtMotion%RefOrientation(1,1:3,1) ) ! x axis call Eye(R33b,ErrStat3,ErrMsg3); if (errStat3 >= AbortErrLev) return ! Rodrigues formula for rotation about a vector From 9329af48bf290c47b265cb8213ac315ed541ea50 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Wed, 30 Sep 2026 09:07:18 -0600 Subject: [PATCH 62/66] Retire the blade permutation from the mirror tooling, assert sweep order With the blades numbered in the direction of rotation, a mirrored blade compares directly against the clockwise blade of the same number, so the B2/B3 exchange that compare_mirror.py provided and five other scripts carried private copies of is machinery without a purpose. It is removed rather than kept as identity code: blade_permutation and its --permute flag, the swap tables in mr_two_rotor, v2_two_rotor, emit_sign_table, render_vtk_pair and check_vtk_surface_mirror, the OutList augmentation in openfast_case_mirror that existed only to give a permuted channel a partner, and the per-pair blade counts whose only consumer was the permutation. The mooring swap maps stay: the OC4 semi's lines 1 and 3 exchange because the platform layout mirrors, which has nothing to do with blade numbering. In its place check_rtest_mirror_pair.py gains a sweep-order assertion on the BAzimuth channels, run for both halves of every pair and wired into run_guards.sh: the median spacing from blade 1 must read +(k-1)*360/N in the rotor's own convention. The renumbering is nearly invisible to the channel comparisons on an axisymmetric case, so it needs a check of its own. Proven able to fail: with the ElastoDyn spacing line reverted the mirrored steady case reads 240 and 120 degrees against the required 120 and 240, a full blade spacing of discrimination. All six registered pairs report a clean mirror with the permutation gone, and the B*Azimuth channels stay informational in the classifier until their behaviour under tilt has been measured under the new convention. Assisted-by: Claude Fable 5 Assisted-by: Claude Sonnet 5 --- reg_tests/otherTests/README.md | 4 +- .../otherTests/check_rtest_mirror_pair.py | 69 +++++++++++++++---- .../otherTests/check_vtk_surface_mirror.py | 5 +- reg_tests/otherTests/compare_mirror.py | 64 +++-------------- reg_tests/otherTests/emit_sign_table.py | 57 +++++---------- reg_tests/otherTests/mr_two_rotor.py | 42 +++-------- reg_tests/otherTests/openfast_case_mirror.py | 63 ++--------------- reg_tests/otherTests/openfast_mirror.py | 9 +-- reg_tests/otherTests/render_vtk_pair.py | 16 ++--- reg_tests/otherTests/run_guards.sh | 8 +++ reg_tests/otherTests/sweep_mirror.py | 65 +++++++++-------- reg_tests/otherTests/v2_two_rotor.py | 23 +------ 12 files changed, 156 insertions(+), 269 deletions(-) diff --git a/reg_tests/otherTests/README.md b/reg_tests/otherTests/README.md index 6b1bd86371..2d99185ca1 100644 --- a/reg_tests/otherTests/README.md +++ b/reg_tests/otherTests/README.md @@ -22,9 +22,9 @@ expressed in different frames. | Script | What it does | |---|---| -| `compare_mirror.py` | the shared classifier. `classify(x, y, tol, floor)` returns `S`, `F`, `A`, `negligible` or `?`. Also holds `blade_permutation`, since blade 1 lies on the mirror plane and blades 2 and 3 exchange. Everything else imports this | +| `compare_mirror.py` | the shared classifier. `classify(x, y, tol, floor)` returns `S`, `F`, `A`, `negligible` or `?`. Blade spacing follows the rotation sense, so blade k pairs with blade k directly and no permutation is needed; the mooring `--swap` mapping (layout pairings) remains where a script needs it. Everything else imports this | | `emit_sign_table.py` | regenerates the measured sign table in `mirror_rotor.rst` by running every registered mirrored pair and classifying every channel | -| `check_rtest_mirror_pair.py` | checks the registered clockwise/mirrored pairs, with per-pair blade count, tolerance and start time | +| `check_rtest_mirror_pair.py` | checks the registered clockwise/mirrored pairs, with per-pair tolerance and start time | | `openfast_case_mirror.py` | clones a regression case verbatim and toggles only `MirrorRotor` | | `mr_two_rotor.py` | compares rotor 1 against rotor 2 inside one multi-rotor glue-code run | | `v2_two_rotor.py` | the same for the AeroDyn driver, handling the `A?BN...` nodal naming | diff --git a/reg_tests/otherTests/check_rtest_mirror_pair.py b/reg_tests/otherTests/check_rtest_mirror_pair.py index 316866a36d..33c373b25c 100644 --- a/reg_tests/otherTests/check_rtest_mirror_pair.py +++ b/reg_tests/otherTests/check_rtest_mirror_pair.py @@ -20,25 +20,25 @@ # pair any tighter than this measures the file format rather than the physics. TOL = 1e-4 -# (clockwise case, mirrored case, blades, tolerance, start of comparison window) +# (clockwise case, mirrored case, tolerance, start of comparison window) # The AWT case brings the shaft to a halt under the HSS brake. The stop is a genuine # discontinuity -- the brake torque switches sign as the shaft sticks -- and it amplifies # round-off, so that pair needs a looser tolerance than the steady cases. Its window opens # earlier as well, to cover the period when the generator is still connected. -PAIRS = [("5MW_Land_noDLL_Steady_CW", "5MW_Land_noDLL_Steady_MirrorRotor", 3, TOL, 0.5), - ("5MW_Land_BD_noDLL_Steady_CW", "5MW_Land_BD_noDLL_Steady_MirrorRotor", 3, TOL, 0.5), +PAIRS = [("5MW_Land_noDLL_Steady_CW", "5MW_Land_noDLL_Steady_MirrorRotor", TOL, 0.5), + ("5MW_Land_BD_noDLL_Steady_CW", "5MW_Land_BD_noDLL_Steady_MirrorRotor", TOL, 0.5), ("AWT_WSt_StartUp_HighSpShutDown", - "AWT_WSt_StartUp_HighSpShutDown_MirrorRotor", 2, 5e-4, 0.25), + "AWT_WSt_StartUp_HighSpShutDown_MirrorRotor", 5e-4, 0.25), # Turbulent inflow with ROSCO in the loop, against a y-reflected turbulence box. # The ElastoDyn pair holds the same tolerance as the steady cases. The BeamDyn # one needs a little more, and only for the root torsional moment, which is small # and stiff enough that its own peak is a harsh denominator. - ("5MW_Land_DLL_WTurb", "5MW_Land_DLL_WTurb_MirrorRotor", 3, TOL, 0.25), - ("5MW_Land_BD_DLL_WTurb", "5MW_Land_BD_DLL_WTurb_MirrorRotor", 3, 1e-3, 0.25)] + ("5MW_Land_DLL_WTurb", "5MW_Land_DLL_WTurb_MirrorRotor", TOL, 0.25), + ("5MW_Land_BD_DLL_WTurb", "5MW_Land_BD_DLL_WTurb_MirrorRotor", 1e-3, 0.25)] -# Channels that pair up by layout rather than by blade order. The OC4 semi's mooring -# line 2 lies on the mirror plane, so lines 1 and 3 swap -- the opposite arrangement to -# the blades, where blade 1 is the one on the plane. +# Channels that pair up by layout rather than by channel name. The OC4 semi's mooring +# line 2 lies on the mirror plane, so lines 1 and 3 swap -- unlike the blades, whose +# numbering now follows the rotation sense directly, so each pairs with the same number. SWAP = {"5MW_OC4Semi_WSt_WavesWN_MirrorRotor": {"FAIRTEN1": "FAIRTEN3", "FAIRTEN3": "FAIRTEN1", "ANCHTEN1": "ANCHTEN3", "ANCHTEN3": "ANCHTEN1"}} @@ -50,12 +50,12 @@ # channel-for-channel in the pair residual to four significant figures. Compared within a # single build the pair resolves completely, so the tolerance is set by provenance, not by # the mirror. Discrimination is still a factor of ~1000. -PAIRS.append(("5MW_OC4Semi_WSt_WavesWN", "5MW_OC4Semi_WSt_WavesWN_MirrorRotor", 3, 5e-3, 0.25)) +PAIRS.append(("5MW_OC4Semi_WSt_WavesWN", "5MW_OC4Semi_WSt_WavesWN_MirrorRotor", 5e-3, 0.25)) sys.path.insert(0, f"{REPO}/reg_tests/lib") sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) import fast_io # noqa: E402 -from compare_mirror import classify, blade_permutation # noqa: E402 +from compare_mirror import classify # noqa: E402 DIAG = {"Time", "ConvError", "ConvIter", "NumUJac"} @@ -71,7 +71,37 @@ def read(case): return info["attribute_names"], np.asarray(data) -def check_pair(cw, mir, nblades, tol, start): +def check_sweep_order(name, names, data, sl): + """Blades must pass a fixed azimuth in numeric order for either rotation sense. + + The AD BAzimuth channels are in the rotor's own convention, so the spacing from + blade 1 reads +120 degrees (three blades) for a clockwise and a mirrored rotor + alike once the blades are numbered in the direction of rotation. Under the old + convention a mirrored rotor read 240 degrees here, which is what this assertion + exists to catch: the renumbering is nearly invisible to the channel comparison + on an axisymmetric case, so it needs its own check. + + Returns the number of failed spacings, or None when the case does not output + the azimuth channels. + """ + idx = {k: v for v, k in enumerate(names)} + if "B1Azimuth" not in idx or "B2Azimuth" not in idx: + return None + nb = 3 if "B3Azimuth" in idx else 2 + bad = 0 + for k in range(2, nb + 1): + want = 360.0 * (k - 1) / nb + d = np.median(np.mod(data[sl, idx[f"B{k}Azimuth"]] + - data[sl, idx["B1Azimuth"]], 360.0)) + ok = abs(d - want) < 1.0 + print(f" sweep order {name}: B{k}Azimuth - B1Azimuth = {d:7.3f} deg " + f"(want {want:.0f}) {'ok' if ok else 'WRONG ORDER'}") + if not ok: + bad += 1 + return bad + + +def check_pair(cw, mir, tol, start): n1, a = read(cw) n2, b = read(mir) if n1 != n2: @@ -85,7 +115,7 @@ def check_pair(cw, mir, nblades, tol, start): for ch in n1: if ch in DIAG: continue - mate = SWAP.get(mir, {}).get(ch) or blade_permutation(ch, nblades) + mate = SWAP.get(mir, {}).get(ch) or ch if mate not in idx: mate = ch got, rel = classify(a[sl, idx[ch]], b[sl, idx[mate]], tol, floor) @@ -94,20 +124,29 @@ def check_pair(cw, mir, nblades, tol, start): for k in ("S", "F", "A", "negligible", "?"): if groups.get(k): print(f"{k:11s} ({len(groups[k]):3d}): {' '.join(groups[k])}") + sweep_bad = 0 + for name, arr in ((cw, a), (mir, b)): + r = check_sweep_order(name, n1, arr, sl) + if r: + sweep_bad += r + bad = groups.get("?", []) print(f" {len(n1) - len(DIAG & set(n1))} channels compared") if bad: print(f" FAIL: {len(bad)} channel(s) unresolved: {' '.join(bad)}") return 1 + if sweep_bad: + print(f" FAIL: blade sweep order wrong in {sweep_bad} spacing(s)") + return 1 print(" PASS: clean mirror pair") return 0 def main(): bad = 0 - for cw, mir, nblades, tol, start in PAIRS: + for cw, mir, tol, start in PAIRS: print(f"=== {cw} vs {mir} ===") - bad += check_pair(cw, mir, nblades, tol, start) + bad += check_pair(cw, mir, tol, start) sys.exit(1 if bad else 0) diff --git a/reg_tests/otherTests/check_vtk_surface_mirror.py b/reg_tests/otherTests/check_vtk_surface_mirror.py index 85d809c535..0e174232b8 100644 --- a/reg_tests/otherTests/check_vtk_surface_mirror.py +++ b/reg_tests/otherTests/check_vtk_surface_mirror.py @@ -63,8 +63,9 @@ CW = "5MW_Land_BD_DLL_WTurb" MR = "5MW_Land_BD_DLL_WTurb_MirrorRotor" -# Blade 1 lies on the mirror plane; blades 2 and 3 exchange. -PAIRS = {"1": "1", "2": "3", "3": "2"} +# Blade spacing follows the rotation sense, so each blade pairs with the +# same-numbered blade. +PAIRS = {"1": "1", "2": "2", "3": "3"} # The ASCII .vtp files carry five decimal places, so agreement cannot be # demonstrated below 1e-5 m no matter how exact the arithmetic is. diff --git a/reg_tests/otherTests/compare_mirror.py b/reg_tests/otherTests/compare_mirror.py index 698374e523..ab76a91585 100644 --- a/reg_tests/otherTests/compare_mirror.py +++ b/reg_tests/otherTests/compare_mirror.py @@ -5,11 +5,10 @@ angle, or below the file's numerical noise floor. Anything else is reported as unclassified, which is what a frame-mixing bug looks like. -Under non-axisymmetric inflow (shear, yaw) the blades no longer line up channel -for channel: mirroring reverses the sweep order, so CW blade 2 must be compared -against mirrored blade 3. Pass --permute to enable that remapping. +Blade spacing follows the rotation direction, so mirrored blade k compares +directly against clockwise blade k: no channel remapping is required. -Usage: compare_mirror.py [--tol 1e-6] [--permute] [--all] +Usage: compare_mirror.py [--tol 1e-6] [--all] """ import re import sys @@ -38,9 +37,10 @@ EXPECT[f"B{_b}N{_n}{_q}"] = "F" # Reported but not asserted. Per-blade azimuth is a wrapped diagnostic angle whose -# mirror reference depends on blade index, rotor tilt and whether the blade -# permutation is in play (under tilt it picks up a clean 180 deg offset). It -# carries no load information, and the rotor-level "Azimuth" channel is asserted. +# mirror reference depends on blade index and rotor tilt (under tilt it picks up a +# clean 180 deg offset). Whether it mirrors cleanly under the new blade-numbering +# convention is still to be measured before it is asserted. It carries no load +# information, and the rotor-level "Azimuth" channel is asserted. INFORMATIONAL = [r"^B\d+Azimuth$"] @@ -52,43 +52,6 @@ def load(path): return names, np.array(rows) -# ElastoDyn names the blade with a trailing index (OoPDefl2) where AeroDyn uses a -# leading one (B2N1Alpha). Listing the prefixes explicitly avoids mangling names -# that merely happen to end in a digit. -ED_BLADE_PREFIX = re.compile( - r"^(OoPDefl|IPDefl|TipALxb|TipALyb|TipALzb|TipDx[bc]|TipDy[bc]|TipDz[bc]|" - r"TipClrnc|TipRDx[bc]|TipRDy[bc]|TipRDz[bc]|RootF[xyz][bc]|RootM[xyz][bc]|" - r"RootMEdg|RootMFlp|RootMIP|RootMOoP|RootFxb|BldPitch|PtchPMzc|" - r"Spn\d+ALxb|Spn\d+ALyb|Spn\d+ALzb|Spn\d+TDxb|Spn\d+TDyb|" - r"Spn\d+TDzb|Spn\d+RDxb|Spn\d+RDyb|Spn\d+RDzb|Spn\d+FLxb|Spn\d+FLyb|" - r"Spn\d+FLzb|Spn\d+MLxb|Spn\d+MLyb|Spn\d+MLzb)(\d)$") - - -def blade_permutation(name, nblades=3): - """Map a CW channel name to the mirrored run's equivalent channel. - - Mirroring reverses the blade sweep order: blade 1 stays put and the rest - reverse, so for three blades 2 and 3 swap. - """ - def swap(k): - return 1 if k == 1 else nblades - k + 2 - - m = ED_BLADE_PREFIX.match(name) - if m: - k = int(m.group(2)) - if 1 <= k <= nblades: - return f"{m.group(1)}{swap(k)}" - return name - - m = re.match(r"^B(\d+)([A-Za-z].*)$", name) - if not m: - return name - k = int(m.group(1)) - if k < 1 or k > nblades: - return name - return f"B{swap(k)}{m.group(2)}" - - def classify(x, y, tol, floor): """Return (class, residual) for one channel pair.""" peak = np.abs(x).max() @@ -113,7 +76,7 @@ def classify(x, y, tol, floor): return "?", min(rs, rf) -def compare(cw_path, mir_path, tol=1e-6, permute=False, only=None): +def compare(cw_path, mir_path, tol=1e-6, only=None): """Return (nchecked, mismatches, unclassified, observed).""" n1, a = load(cw_path) n2, b = load(mir_path) @@ -133,10 +96,7 @@ def compare(cw_path, mir_path, tol=1e-6, permute=False, only=None): continue if only is not None and not any(re.search(p, ch) for p in only): continue - mate = blade_permutation(ch) if permute else ch - if mate not in idx: - continue - got, rel = classify(a[sl, idx[ch]], b[sl, idx[mate]], tol, floor) + got, rel = classify(a[sl, idx[ch]], b[sl, idx[ch]], tol, floor) observed[ch] = got if any(re.search(p, ch) for p in INFORMATIONAL): continue @@ -153,15 +113,13 @@ def compare(cw_path, mir_path, tol=1e-6, permute=False, only=None): def main(): args = [a for a in sys.argv[1:] if not a.startswith("--")] tol = float(sys.argv[sys.argv.index("--tol") + 1]) if "--tol" in sys.argv else 1e-6 - permute = "--permute" in sys.argv - checked, bad, unknown, observed = compare(args[0], args[1], tol, permute) + checked, bad, unknown, observed = compare(args[0], args[1], tol) if "--all" in sys.argv: for ch, cls in observed.items(): print(f" {ch:14s} {cls}") - print(f"channels checked : {checked}" - + (" (blade permutation on)" if permute else "")) + print(f"channels checked : {checked}") for ch, rel in unknown: print(f" UNCLASSIFIED {ch:14s} rel={rel:.3e}") for ch, exp, got, rel in bad: diff --git a/reg_tests/otherTests/emit_sign_table.py b/reg_tests/otherTests/emit_sign_table.py index 80804ea7ba..bdced07a45 100644 --- a/reg_tests/otherTests/emit_sign_table.py +++ b/reg_tests/otherTests/emit_sign_table.py @@ -26,67 +26,46 @@ R = os.path.join(REPO_ROOT, "reg_tests", "r-test") GC = f"{R}/glue-codes/openfast" -# label, clockwise case, mirrored case, blades +# label, clockwise case, mirrored case FILE_PAIRS = [ ("ElastoDyn + AeroDyn", "5MW_Land_noDLL_Steady_CW", - "5MW_Land_noDLL_Steady_MirrorRotor", 3), + "5MW_Land_noDLL_Steady_MirrorRotor"), ("BeamDyn blades", "5MW_Land_BD_noDLL_Steady_CW", - "5MW_Land_BD_noDLL_Steady_MirrorRotor", 3), + "5MW_Land_BD_noDLL_Steady_MirrorRotor"), ("MHK buoyancy", "MHK_RM1_Floating_Steady_CW", - "MHK_RM1_Floating_Steady_MirrorRotor", 2), + "MHK_RM1_Floating_Steady_MirrorRotor"), ("AeroDisk, yawed", "5MW_Land_ADsk_SED_Yaw_CW", - "5MW_Land_ADsk_SED_Yaw_MirrorRotor", 3), + "5MW_Land_ADsk_SED_Yaw_MirrorRotor"), ("OLAF free wake", f"{R}/modules/aerodyn/ad_B1n2_OLAF_CW/ad_driver.outb", - f"{R}/modules/aerodyn/ad_B1n2_OLAF_MirrorRotor/ad_driver.outb", 1), + f"{R}/modules/aerodyn/ad_B1n2_OLAF_MirrorRotor/ad_driver.outb"), ] -# label, single output file, per-rotor channel prefixes, blades +# label, single output file, per-rotor channel prefixes WITHIN_PAIRS = [ ("AeroDyn nodal outputs", os.path.join(REPO_ROOT, "build-docker-double", "reg_tests", "modules", "aerodyn", "ad_MultipleHAWT_MirrorRotor", "ad_driver.T1.outb"), os.path.join(REPO_ROOT, "build-docker-double", "reg_tests", "modules", "aerodyn", "ad_MultipleHAWT_MirrorRotor", "ad_driver.T2.outb"), - None, 3), + None), ("Twin-rotor semisubmersible", f"{GC}/5MW_MRSemi_DLL_WSt_WavesIrr_MirrorRotor/" "5MW_MRSemi_DLL_WSt_WavesIrr_MirrorRotor.outb", - None, ("R1", "R2"), 3), + None, ("R1", "R2")), ] -def swap_blades(name, nblades): - """Blade 1 lies on the mirror plane; the others exchange in reverse order.""" - if nblades < 3: - return name - order = {"1": "1", "2": "3", "3": "2"} - # AeroDyn module and nodal blade channels: B2N003Fn, AB2N003Fn - m = re.match(r"^(A?)B([123])(N\d+.*)$", name) - if m: - return f"{m.group(1)}B{order[m.group(2)]}{m.group(3)}" - # Any other per-blade channel named B: B2RootFxr, B2TipTDxr, - # B2AeroPwr. Must follow the node pattern above, which is more specific. - m = re.match(r"^B([123])([A-Za-z].*)$", name) - if m: - return f"B{order[m.group(1)]}{m.group(2)}" - # ElastoDyn trailing-index channels: RootMxc2, OoPDefl3 - m = re.match(r"^(.*?[A-Za-z])([123])$", name) - if m and not re.search(r"\d$", m.group(1)): - return m.group(1) + order[m.group(2)] - return name - - # Mooring lines and connections exchange in mirror pairs as well, but the pairing # depends on the layout. Reported separately rather than guessed at. MOORING = re.compile(r"^(FAIRTEN|ANCHTEN|CON\d|L\d+N|M\d+N|P\d+F)") -def measure(a, na, b, nb, nblades, tol, floor): +def measure(a, na, b, nb, tol, floor): out = {} idx = {n: i for i, n in enumerate(nb)} for i, n in enumerate(na): - j = idx.get(swap_blades(n, nblades), idx.get(n)) + j = idx.get(n) if j is None: continue cls, res = classify(a[:, i], b[:, j], tol, floor) @@ -182,8 +161,8 @@ def emit_map(groups, mooring, origin, conflicts, tol, floor): quantity such as ``TwrBsMxt`` is simply the response of an unchanged structure to a counter-clockwise rotor. -Blade 1 lies on the mirror plane and blades 2 and 3 exchange, so a mirrored -blade 2 is compared against the clockwise blade 3. Mooring channels are set +Blade spacing follows the rotation direction, so a mirrored blade is compared +against the clockwise blade of the same number. Mooring channels are set aside because which line pairs with which depends on the layout. """) @@ -230,7 +209,7 @@ def main(): seen = defaultdict(set) origin = defaultdict(set) - for label, cw, mir, nb_ in FILE_PAIRS: + for label, cw, mir in FILE_PAIRS: if cw.startswith("/") or "/" in cw: pa, pb = cw, mir # explicit paths, for the module-level driver cases else: @@ -241,7 +220,7 @@ def main(): da, ia, _ = pass_fail.readFASTOut(pa) db, ib, _ = pass_fail.readFASTOut(pb) res = measure(da, list(ia["attribute_names"]), db, - list(ib["attribute_names"]), nb_, a.tol, a.floor) + list(ib["attribute_names"]), a.tol, a.floor) c = Counter(v[0] for v in res.values()) print(f"{label:28s} same={c['S']:4d} flipped={c['F']:3d} " f"wrapped={c['A']:3d} negligible={c['negligible']:3d} " @@ -250,7 +229,7 @@ def main(): seen[n].add(cl) origin[n].add(label) - for label, pa, pb, prefixes, nb_ in WITHIN_PAIRS: + for label, pa, pb, prefixes in WITHIN_PAIRS: if not os.path.exists(pa): print(f" skip {label}: missing output", file=sys.stderr) continue @@ -268,13 +247,13 @@ def main(): idx = {n: i for i, n in enumerate(nbn)} for n in na2: base = n[len(p1):] - j = idx.get(p2 + swap_blades(base, nb_), idx.get(p2 + base)) + j = idx.get(p2 + base) if j is None: continue cls, r = classify(da[:, na.index(n)], db[:, j], a.tol, a.floor) res[base] = (cls, r) else: - res = measure(da, na, db, nbn, nb_, a.tol, a.floor) + res = measure(da, na, db, nbn, a.tol, a.floor) c = Counter(v[0] for v in res.values()) print(f"{label:28s} same={c['S']:4d} flipped={c['F']:3d} " f"wrapped={c['A']:3d} negligible={c['negligible']:3d} " diff --git a/reg_tests/otherTests/mr_two_rotor.py b/reg_tests/otherTests/mr_two_rotor.py index 9c449d1250..0e5e2aa1cc 100644 --- a/reg_tests/otherTests/mr_two_rotor.py +++ b/reg_tests/otherTests/mr_two_rotor.py @@ -6,7 +6,8 @@ symmetric about y = 0, the whole system maps onto itself under y -> -y, so R2 must be the mirror image of R1 within the same solve. -Blade 1 lies on the mirror plane at azimuth 0, so blades 2 and 3 exchange. +Blade spacing follows the rotation sense, so a mirrored blade compares directly +against the clockwise blade of the same number. Shared (unprefixed) channels belong to the single platform. Under a symmetric solution the antisymmetric ones must vanish, which is a much sharper statement @@ -14,7 +15,6 @@ """ import argparse import os -import re import sys from collections import Counter @@ -35,24 +35,6 @@ SYM_SHARED = ("HydroFxi", "HydroFzi", "HydroMyi", "RBTDXss", "RBTDZss", "RBRDYss") -BLADE_RE = re.compile(r"^(.*?)([123])(N\d+)?(.*)$") - - -def swap_blade(name): - """Exchange blades 2 and 3; blade 1 sits on the mirror plane.""" - for pat, rep in ((r"^B2N", "B3N"), (r"^B3N", "B2N")): - if re.match(pat, name): - return re.sub(pat, rep, name) - m = re.match(r"^(Root[A-Za-z]+)([123])$", name) - if m: - return m.group(1) + {"1": "1", "2": "3", "3": "2"}[m.group(2)] - m = re.match(r"^(.*?)([123])$", name) - if m and m.group(1).startswith(("OoPDefl", "IPDefl", "TwstDefl", "BldPitch", - "TipDx", "TipDy", "TipClrnc")): - return m.group(1) + {"1": "1", "2": "3", "3": "2"}[m.group(2)] - return name - - def main(): ap = argparse.ArgumentParser() ap.add_argument("outb") @@ -74,17 +56,16 @@ def main(): counts, unresolved, rows = Counter(), [], [] for base in sorted(r1): - partner = swap_blade(base) - if partner not in r2: + if base not in r2: counts["missing"] += 1 continue - cls, res = classify(col[r1[base]], col[r2[partner]], a.tol, a.floor) + cls, res = classify(col[r1[base]], col[r2[base]], a.tol, a.floor) counts[cls] += 1 - rows.append((base, partner, cls, res)) + rows.append((base, cls, res)) if cls == "?": - unresolved.append((base, partner, res, + unresolved.append((base, res, np.abs(col[r1[base]]).max(), - np.abs(col[r2[partner]]).max())) + np.abs(col[r2[base]]).max())) label = {"S": "same", "F": "flipped", "A": "angle-wrapped", "negligible": "negligible", "?": "unresolved"} @@ -94,14 +75,13 @@ def main(): print(f"{label.get(key, key):16s} {counts[key]}") if a.show: - for base, partner, cls, res in rows: - tag = base if base == partner else f"{base}->{partner}" - print(f" {tag:22s} {label.get(cls, cls):14s} {res:.3e}") + for base, cls, res in rows: + print(f" {base:22s} {label.get(cls, cls):14s} {res:.3e}") if unresolved: print("\nunresolved:") - for base, partner, res, p1, p2 in unresolved: - print(f" {base:20s} vs {partner:20s} res={res:.3e} " + for base, res, p1, p2 in unresolved: + print(f" {base:20s} res={res:.3e} " f"peakR1={p1:.6g} peakR2={p2:.6g}") print("\n--- shared platform channels") diff --git a/reg_tests/otherTests/openfast_case_mirror.py b/reg_tests/otherTests/openfast_case_mirror.py index 86ae4745ef..7b04a754f8 100644 --- a/reg_tests/otherTests/openfast_case_mirror.py +++ b/reg_tests/otherTests/openfast_case_mirror.py @@ -28,7 +28,7 @@ sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) sys.path.insert(0, f"{REPO}/reg_tests/lib") -from compare_mirror import classify, blade_permutation # noqa: E402 +from compare_mirror import classify # noqa: E402 import fast_io # noqa: E402 DIAG = {"Time", "ConvError", "ConvIter", "NumUJac"} @@ -42,45 +42,6 @@ def set_var(text, var, value): return new -def add_partner_channels(path, nblades): - """Ensure every blade-indexed output has its mirror partner in the OutList. - - A case that only prints blades 1 and 3 gives the mirrored run's blade 3 nothing - to be compared against, since it corresponds to the clockwise run's blade 2. - """ - txt = open(path, errors="replace").read() - lines = txt.split("\n") - cand = [i for i, l in enumerate(lines) if "outlist" in l.lower() and '"' not in l] - if not cand: - return - # These files carry a second, usually empty, nodal-output OutList at the end. - start = cand[0] - end = next((i for i in range(start, len(lines)) if lines[i].strip().upper().startswith("END")), None) - if end is None: - return - - have, order = set(), [] - for i in range(start + 1, end): - for ch in re.findall(r'"([^"]+)"', lines[i]): - for c in ch.split(","): - c = c.strip() - if c: - have.add(c) - order.append(c) - - add = [] - for c in order: - mate = blade_permutation(c, nblades) - if mate != c and mate not in have: - have.add(mate) - add.append(mate) - if not add: - return - - lines[end:end] = [f'"{c}"' for c in add] - open(path, "w").write("\n".join(lines)) - - def negate_vars(d, names): """Negate asymmetric scalar inputs in the mirrored clone. @@ -159,17 +120,6 @@ def build(case, mirrored, tmax, negate=(), series=(), reuse=False): txt = set_var(txt, "TMax", str(tmax)) open(fst, "w").write(txt) - # Give every blade-indexed channel a partner to be compared against. - for f in os.listdir(d): - if not f.lower().endswith(".dat"): - continue - p = os.path.join(d, f) - body = open(p, errors="replace").read() - head = body[:400].upper() - if "ELASTODYN" in head or "AERODYN" in head: - m = re.search(r"^\s*(\d+)\s+NumBl\b", body, re.MULTILINE) - add_partner_channels(p, int(m.group(1)) if m else 3) - if mirrored and negate: negate_vars(d, negate) if mirrored and series: @@ -201,9 +151,11 @@ def main(): negate = sys.argv[sys.argv.index("--negate") + 1].split(",") if "--negate" in sys.argv else () series = sys.argv[sys.argv.index("--mirror-series") + 1].split(",") if "--mirror-series" in sys.argv else () - # Components that are not blades also permute under the mirror, but which ones pair up - # depends on the layout rather than on blade order -- the OC4 semi's mooring line 2 - # lies on the mirror plane, so lines 1 and 3 swap. State those pairings explicitly. + # Mooring lines and other layout components also swap under the mirror, but which + # ones pair up depends on the layout rather than being fixed by channel name -- the + # OC4 semi's mooring line 2 lies on the mirror plane, so lines 1 and 3 swap. Blades + # need no such mapping: blade numbering now follows the rotation sense directly, so + # each pairs with the same number. State the layout pairings explicitly. swap = {} if "--swap" in sys.argv: for pair in sys.argv[sys.argv.index("--swap") + 1].split(","): @@ -220,7 +172,6 @@ def main(): sl = slice(int(0.25 * len(a)), None) phys = [idx[c] for c in n1 if c not in DIAG] floor = 1e-9 * np.abs(a[sl][:, phys]).max() - nb = int(sys.argv[sys.argv.index("--nblades") + 1]) if "--nblades" in sys.argv else 3 if "--dump" in sys.argv: rows = list(range(0, len(a), max(1, len(a) // 14))) @@ -235,7 +186,7 @@ def main(): for ch in n1: if ch in DIAG: continue - mate = swap.get(ch) or blade_permutation(ch, nb) + mate = swap.get(ch) or ch if mate not in idx: mate = ch got, rel = classify(a[sl, idx[ch]], b[sl, idx[mate]], tol, floor) diff --git a/reg_tests/otherTests/openfast_mirror.py b/reg_tests/otherTests/openfast_mirror.py index 4a48f1dc9f..42a810369e 100644 --- a/reg_tests/otherTests/openfast_mirror.py +++ b/reg_tests/otherTests/openfast_mirror.py @@ -30,7 +30,7 @@ WORK = os.path.join(os.environ.get("TMPDIR", "/tmp"), "of_mirror") sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) -from compare_mirror import classify, blade_permutation # noqa: E402 +from compare_mirror import classify # noqa: E402 RIGID = "--rigid" in sys.argv # Free drivetrain: exercises the gearbox efficiency factor and shaft torque paths, @@ -281,10 +281,7 @@ def main(): for ch in n1: if ch == "Time": continue - mate = blade_permutation(ch) - if mate not in idx: - mate = ch - got, rel = classify(a[sl, idx[ch]], b[sl, idx[mate]], TOL, floor) + got, rel = classify(a[sl, idx[ch]], b[sl, idx[ch]], TOL, floor) if ch in DIAG: got = "diagnostic" groups.setdefault("diagnostic", []).append(ch) @@ -293,7 +290,7 @@ def main(): print(f"{ch:14s} {np.abs(a[sl, idx[ch]]).max():12.5g} " f"{got:>10s} {rel:10.2e}") - print("\n--- measured summary (blade permutation applied) ---") + print("\n--- measured summary ---") for k in ("S", "F", "A", "negligible", "?"): if groups[k]: print(f"{k:11s} ({len(groups[k]):2d}): {' '.join(groups[k])}") diff --git a/reg_tests/otherTests/render_vtk_pair.py b/reg_tests/otherTests/render_vtk_pair.py index 17729b5a77..fff72f5c1b 100644 --- a/reg_tests/otherTests/render_vtk_pair.py +++ b/reg_tests/otherTests/render_vtk_pair.py @@ -767,20 +767,14 @@ def animate(cw_meshes, mr_meshes, frames, out_dir, want, fps, dpi, dt): # They are compared as point clouds instead. _SWEPT = ("GroundSurface", "TowerSurface", "NacelleSurface", "HubSurface") -# The blade index is not reliably the end of a mesh name: it is followed by -# "_Reference" on reference meshes and by "Surface" on surface meshes. Matching -# the end of the name silently compared a blade against itself, which shows up as -# a clean 120 degree azimuth error and looks convincingly like a real defect. -_BLADE_RE = re.compile(r"B(\d+)") - - def partner(name): """The mirrored mesh a clockwise mesh should be compared against. - Blade 1 lies on the mirror plane and blades 2 and 3 exchange. + Blade spacing follows the rotation sense, so a mirrored blade's mesh is + directly the mirror image of the same-numbered clockwise blade: the + partner mesh is simply the same name. """ - swap = {"2": "3", "3": "2"} - return _BLADE_RE.sub(lambda m: "B" + swap.get(m.group(1), m.group(1)), name, count=1) + return name def _cloud_sep(a, b): @@ -891,7 +885,7 @@ def main(argv=None): print(f"rendered {label}") print(f"{len(cw)} meshes\n") print("largest node separation after re-applying the mirror, per mesh") - print("(blades 2 and 3 compared against their permuted partners)") + print("(each blade compared against the same-numbered mirrored blade)") for name in sorted(devs, key=lambda n: devs[n][0], reverse=True): val, ordered = devs[name] note = "" if ordered else " (point cloud; vertex order reverses)" diff --git a/reg_tests/otherTests/run_guards.sh b/reg_tests/otherTests/run_guards.sh index ea5ea2b08d..f0bb4b3bb6 100755 --- a/reg_tests/otherTests/run_guards.sh +++ b/reg_tests/otherTests/run_guards.sh @@ -75,6 +75,14 @@ echo echo "=== VTK surface mirror ===" python3 "$HERE/check_vtk_surface_mirror.py" +# The blade renumbering (spacing carries the rotation sense) is nearly invisible +# to the channel comparisons on an axisymmetric case, so the pair check carries a +# dedicated sweep-order assertion on the BAzimuth channels. This reads the stored +# baselines only, no simulation. +echo +echo "=== mirror pairs and blade sweep order (stored baselines) ===" +python3 "$HERE/check_rtest_mirror_pair.py" + # --------------------------------------------------------------------------- # FAST.Farm guards # diff --git a/reg_tests/otherTests/sweep_mirror.py b/reg_tests/otherTests/sweep_mirror.py index 99ee694f6b..80b6a877f3 100644 --- a/reg_tests/otherTests/sweep_mirror.py +++ b/reg_tests/otherTests/sweep_mirror.py @@ -30,48 +30,48 @@ "modules", "aerodyn", "aerodyn_driver") WORK = os.path.join(os.environ.get("TMPDIR", "/tmp"), "mirror_sweep") -# name -> (dvr edits, primary edits, mirrored-deck overrides, blade permutation[, tol]) +# name -> (dvr edits, primary edits, mirrored-deck overrides[, tol]) # Tolerance defaults to 1e-6; raise it only where a stateful model makes exact # agreement unreasonable, and say why. MATRIX = [ - ("base", {}, {}, {}, False), - ("pitch_+10", {"BldPitch(1)": "10.0"}, {}, {}, False), - ("pitch_-3", {"BldPitch(1)": "-3.0"}, {}, {}, False), - ("wind_4", {"HWindSpeed": "4.0"}, {}, {}, False), - ("wind_20_stall", {"HWindSpeed": "20.0"}, {}, {}, False), - ("highTSR_25rpm", {"RotSpeed(1)": "25.0"}, {}, {}, False), - ("lowTSR_3rpm", {"RotSpeed(1)": "3.0"}, {}, {}, False), + ("base", {}, {}, {}), + ("pitch_+10", {"BldPitch(1)": "10.0"}, {}, {}), + ("pitch_-3", {"BldPitch(1)": "-3.0"}, {}, {}), + ("wind_4", {"HWindSpeed": "4.0"}, {}, {}), + ("wind_20_stall", {"HWindSpeed": "20.0"}, {}, {}), + ("highTSR_25rpm", {"RotSpeed(1)": "25.0"}, {}, {}), + ("lowTSR_3rpm", {"RotSpeed(1)": "3.0"}, {}, {}), ("propbrake", {"HWindSpeed": "25.0", "RotSpeed(1)": "3.0", - "BldPitch(1)": "-10.0"}, {}, {}, False), - # Shaft tilt skews the inflow, so the rotor sees azimuthal variation and the - # blades no longer pair up index for index. - ("tilt_5", {"ShftTilt(1)": "-5.0"}, {}, {}, True), - ("precone_2.5", {"Precone(1)": "2.5"}, {}, {}, False), + "BldPitch(1)": "-10.0"}, {}, {}), + # Shaft tilt skews the inflow, so the rotor sees azimuthal variation, but blade + # spacing still follows the rotation sense, so the blades pair up index for index. + ("tilt_5", {"ShftTilt(1)": "-5.0"}, {}, {}), + ("precone_2.5", {"Precone(1)": "2.5"}, {}, {}), # Vertical shear is symmetric about the mirror plane, so the deck is shared; - # the blades still swap sweep order. - ("shear_0.2", {"PLExp": "0.2"}, {}, {}, True), + # the blades still pair up index for index. + ("shear_0.2", {"PLExp": "0.2"}, {}, {}), # Yaw is a global-frame orientation, so the mirrored run gets -yaw. - ("yaw_20", {"NacYaw(1)": "20.0"}, {}, {"NacYaw(1)": "-20.0"}, True), + ("yaw_20", {"NacYaw(1)": "20.0"}, {}, {"NacYaw(1)": "-20.0"}), ("yaw_20_skew", {"NacYaw(1)": "20.0"}, {"Skew_Mod": "1"}, - {"NacYaw(1)": "-20.0"}, True), - ("yaw_-20", {"NacYaw(1)": "-20.0"}, {}, {"NacYaw(1)": "20.0"}, True), - ("wake_off", {}, {"Wake_Mod": "0"}, {}, False), - ("bem_polar", {}, {"BEM_Mod": "2"}, {}, False), + {"NacYaw(1)": "-20.0"}), + ("yaw_-20", {"NacYaw(1)": "-20.0"}, {}, {"NacYaw(1)": "20.0"}), + ("wake_off", {}, {"Wake_Mod": "0"}, {}), + ("bem_polar", {}, {"BEM_Mod": "2"}, {}), # The polar BEM path measures skew with its own psiSkewOffset, built from a # separate cross product, so it needs covering independently of BEM_Mod=1. ("bem_polar_skew", {"NacYaw(1)": "20.0"}, {"BEM_Mod": "2", "Skew_Mod": "1"}, - {"NacYaw(1)": "-20.0"}, True), - ("bem_polar_shear", {"PLExp": "0.2"}, {"BEM_Mod": "2"}, {}, True), - ("dbemt_2", {}, {"DBEMT_Mod": "2"}, {}, False), - ("ua_3", {}, {"UA_Mod": "3"}, {}, False), - ("ua_6_oye", {}, {"UA_Mod": "6"}, {}, False), - ("ua_4_hgm", {}, {"UA_Mod": "4"}, {}, False), + {"NacYaw(1)": "-20.0"}), + ("bem_polar_shear", {"PLExp": "0.2"}, {"BEM_Mod": "2"}, {}), + ("dbemt_2", {}, {"DBEMT_Mod": "2"}, {}), + ("ua_3", {}, {"UA_Mod": "3"}, {}), + ("ua_6_oye", {}, {"UA_Mod": "6"}, {}), + ("ua_4_hgm", {}, {"UA_Mod": "4"}, {}), # Shear + yaw + unsteady aero is the stiffest combination in the matrix. UA carries # state and is solved iteratively, so the two runs converge to slightly different # round-off; the residual here is ~1.5 N-m on a 9e5 N-m moment. ("shear_yaw_ua", {"PLExp": "0.2", "NacYaw(1)": "15.0"}, {"UA_Mod": "3", "Skew_Mod": "1"}, - {"NacYaw(1)": "-15.0"}, True, 1e-5), + {"NacYaw(1)": "-15.0"}, 1e-5), ] @@ -126,8 +126,8 @@ def main(): fails = 0 print(f"{'variant':18s} {'chk':>4s} result") for row in rows: - name, dvr_e, pri_e, over, permute = row[:5] - tol = row[5] if len(row) > 5 else 1e-6 + name, dvr_e, pri_e, over = row[:4] + tol = row[4] if len(row) > 4 else 1e-6 d = os.path.join(WORK, name) try: cw = build_case(d, False, dvr_e, pri_e, over) @@ -148,11 +148,8 @@ def main(): fails += 1 continue - checked, bad, unknown, _ = compare(cw_out, mir_out, tol=tol, - permute=permute) - tag = "perm" if permute else "" - if tol != 1e-6: - tag += f" tol={tol:g}" + checked, bad, unknown, _ = compare(cw_out, mir_out, tol=tol) + tag = f"tol={tol:g}" if tol != 1e-6 else "" if bad or unknown: fails += 1 print(f"{name:18s} {checked:4d} FAIL {tag}") diff --git a/reg_tests/otherTests/v2_two_rotor.py b/reg_tests/otherTests/v2_two_rotor.py index 6f9ee01bee..e7c618a389 100644 --- a/reg_tests/otherTests/v2_two_rotor.py +++ b/reg_tests/otherTests/v2_two_rotor.py @@ -5,11 +5,10 @@ mirror images of each other, with no run-to-run difference of any kind to hide behind: same solver, same time steps, same wind. -Mirroring reverses the order in which the blades sweep, so blade 1 keeps its -place and blades 2 and 3 exchange. +Blade spacing follows the rotation sense, so a mirrored blade compares directly +against the clockwise blade of the same number. """ import os -import re import sys import numpy as np @@ -24,19 +23,6 @@ os.environ.get("TMPDIR", "/tmp"), "v2test", "mir") TOL = float(sys.argv[sys.argv.index("--tol") + 1]) if "--tol" in sys.argv else 1e-6 -# Driver channels are ABN; the module form is BN... -AB = re.compile(r"^(A?B)(\d+)(N.*)$") - - -def swap(name, nblades=3): - m = AB.match(name) - if not m: - return name - k = int(m.group(2)) - if not 1 <= k <= nblades: - return name - return f"{m.group(1)}{1 if k == 1 else nblades - k + 2}{m.group(3)}" - def load(path): d, info, _ = fast_io.load_output(path) @@ -64,10 +50,7 @@ def find(turbine): for ch in n1: if ch == "Time": continue - mate = swap(ch) - if mate not in idx: - mate = ch - x, y = a[sl, idx[ch]], b[sl, idx[mate]] + x, y = a[sl, idx[ch]], b[sl, idx[ch]] peak = np.abs(x).max() if peak < floor: groups.setdefault("negligible", []).append((ch, 0.0)) From 8340b56a229aa6dadc71f07c129e907d4ecc4d57 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Wed, 30 Sep 2026 09:07:18 -0600 Subject: [PATCH 63/66] Bump r-test for the blade renumbering baselines Points r-test at the regenerated baselines for the six cases whose B2- and B3-indexed channels relabel under the new blade numbering, plus the steady pair's new BAzimuth output channels. Verified channel by channel: nothing outside the per-blade channels moved, except the twin rotor's y-antisymmetric round-off channels, and the clockwise steady case moved nothing at all. All seventeen mirrorrotor regression cases pass. Assisted-by: Claude Fable 5 --- 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 fd874f803a..b52af0e9fd 160000 --- a/reg_tests/r-test +++ b/reg_tests/r-test @@ -1 +1 @@ -Subproject commit fd874f803a18a96b94e5d7e4bd0bec7bba1fae76 +Subproject commit b52af0e9fd93767c8611ae9c59e3060131213955 From 946dcef5da37451f83c531dd196462b158e6198d Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Wed, 30 Sep 2026 09:15:08 -0600 Subject: [PATCH 64/66] Document the blade numbering and remeasure the sign map The mirror documentation described the old convention, in which mirroring reversed the order the blades sweep past a fixed point and blade 2 of the mirrored rotor corresponded to blade 3 of the clockwise one. With the blade spacing now carrying the rotation sense that correspondence is the identity, so the paragraph states the new rule - blade k against blade k, blades passing a fixed azimuth in numeric order for either sense - and keeps the mooring exchange, which comes from mirroring the platform layout and is unchanged. The AWT table row loses its "needs no blade swap" remark for the same reason, and the AeroDyn driver documentation says which of its two geometry formats spaces the blades itself: the basic HAWT format carries the sign automatically, while the advanced format takes the blade azimuths as given and a mirrored rotor's user supplies them mirrored. The sign map is regenerated from the new baselines: 1206 channels, 689 identical, 328 sign-flipped, one mirrored angle, 55 below the noise floor, 133 mooring channels set aside, none unresolved. The three channels new to the measurement are the steady pair's BAzimuth outputs, which measure as identical - under the old convention their mirror reference depended on blade index and tilt, which is why compare_mirror.py carried them as informational rather than asserted. Measured clean, they are now asserted like any other channel and the informational list is empty. Assisted-by: Claude Fable 5 --- docs/source/user/aerodyn/driver.rst | 7 ++++++- docs/source/user/glue-code/mirror_rotor.rst | 19 ++++++++++++------- .../user/glue-code/mirror_rotor_sign_map.rst | 17 +++++++++++++---- .../user/glue-code/mirror_rotor_sign_map.yaml | 3 +++ reg_tests/otherTests/compare_mirror.py | 12 ++++++------ 5 files changed, 40 insertions(+), 18 deletions(-) diff --git a/docs/source/user/aerodyn/driver.rst b/docs/source/user/aerodyn/driver.rst index 69726c084e..3eb06f8044 100644 --- a/docs/source/user/aerodyn/driver.rst +++ b/docs/source/user/aerodyn/driver.rst @@ -166,7 +166,12 @@ geometry formats described below, followed by `MirrorRotor`. `MirrorRotor` is read for both formats. Setting it to `True` runs the turbine as its mirror image, so the rotor turns counter-clockwise viewed from upwind, without changing any of the geometry, blade or airfoil inputs that describe it. The driver -mirrors the prescribed hub motion and blade pitch to match. See +mirrors the prescribed hub motion and blade pitch to match. In the basic HAWT +format the blade azimuth spacing also carries the rotation sense, so the blades +are numbered in the direction of rotation and blade k of a mirrored rotor is +the mirror image of blade k of a clockwise one. The advanced format takes the +blade azimuths (`BldOrientation_h`) as given, so for a mirrored rotor the user +supplies the mirrored azimuths themselves. See :numref:`glue-code-mirror-rotor` for what the flag does and what it does not mirror. diff --git a/docs/source/user/glue-code/mirror_rotor.rst b/docs/source/user/glue-code/mirror_rotor.rst index 2fbf82e1d6..8124809de9 100644 --- a/docs/source/user/glue-code/mirror_rotor.rst +++ b/docs/source/user/glue-code/mirror_rotor.rst @@ -324,10 +324,14 @@ are the ElastoDyn + AeroDyn pair, the BeamDyn pair, the marine-turbine pair, the yawed AeroDisk pair, the free-wake pair, the two-rotor aerodynamic driver case and the twin-rotor semisubmersible. -Note that mirroring reverses the order in which the blades sweep past a given -point, so under non-axisymmetric inflow — shear, yaw, or shaft tilt — blade 2 of -the mirrored rotor corresponds to blade 3 of the clockwise one. Mooring lines -exchange in the same way, and which line pairs with which depends on the layout. +The blade azimuth spacing carries the rotation sense, so the blades are +numbered in the direction of rotation for either convention: blade k of the +mirrored rotor occupies the mirror image of blade k of the clockwise one, the +blades pass a fixed azimuth in numeric order either way, and every per-blade +channel compares directly against the channel of the same number. Mooring +lines are different: the platform layout mirrors as geometry, so which line +pairs with which depends on the layout — on the OC4 semisubmersible, lines 1 +and 3 exchange. It records how the two runs of a **symmetric** comparison relate to each other, which is how the implementation is verified. It is not a claim that these @@ -397,13 +401,13 @@ their mirror-invariant partners — ``*Cy``, ``*Cm`` and ``*Ct`` alongside ``*Cl``, ``*Cd``, ``*Cx`` and ``*Cn`` — so that a sign applied to a whole group by mistake cannot pass unnoticed. -Across the seven pairs, 1015 channels resolve: 686 identical, 328 sign-flipped +Across the seven pairs, 1018 channels resolve: 689 identical, 328 sign-flipped and one mirrored angle, with a further 55 below the noise floor in every case and 133 mooring channels set aside because their pairing is layout-specific. No channel is unresolved. The grouped form above is the one to read. The complete per-channel map, listing -all 1203 channels alphabetically with the pairs each was measured in, is at +all 1206 channels alphabetically with the pairs each was measured in, is at :ref:`glue-code-mirror-rotor-sign-map`; the same data is available as ``mirror_rotor_sign_map.yaml`` for anything that wants to consume it. Both are generated by the same measurement and neither should be edited by hand. @@ -534,7 +538,8 @@ so ``ctest -R mirrorrotor`` runs the set: * - ``AWT_WSt_StartUp_HighSpShutDown_MirrorRotor`` - The high-speed-shaft brake taking the rotor down through zero speed, which is the one torque signed by the direction of rotation. Also a - two-bladed teetering rotor, which needs no blade swap + two-bladed teetering rotor, for which the reversed blade spacing places + blade 2 at the same opposing azimuth either way * - ``5MW_Land_DLL_WTurb_MirrorRotor`` - Turbulence and a Bladed-style controller, ElastoDyn blades * - ``5MW_Land_BD_DLL_WTurb_MirrorRotor`` diff --git a/docs/source/user/glue-code/mirror_rotor_sign_map.rst b/docs/source/user/glue-code/mirror_rotor_sign_map.rst index 73d3151d10..33cbae48e6 100644 --- a/docs/source/user/glue-code/mirror_rotor_sign_map.rst +++ b/docs/source/user/glue-code/mirror_rotor_sign_map.rst @@ -28,13 +28,13 @@ simulation the tower, support structure and inflow are not mirrored, so a quantity such as ``TwrBsMxt`` is simply the response of an unchanged structure to a counter-clockwise rotor. -Blade 1 lies on the mirror plane and blades 2 and 3 exchange, so a mirrored -blade 2 is compared against the clockwise blade 3. Mooring channels are set +Blade spacing follows the rotation direction, so a mirrored blade is compared +against the clockwise blade of the same number. Mooring channels are set aside because which line pairs with which depends on the layout. -Measured at a relative tolerance of ``0.005`` with a noise floor of ``1e-08``, across 1203 channels. +Measured at a relative tolerance of ``0.005`` with a noise floor of ``1e-08``, across 1206 channels. -* **identical** (686) -- v' = v +* **identical** (689) -- v' = v * **sign-flipped** (328) -- v' = -v * **mirrored angle** (1) -- v' = -v, wrapped * **below the noise floor** (55) -- indistinguishable from zero everywhere @@ -2537,6 +2537,9 @@ Measured at a relative tolerance of ``0.005`` with a noise floor of ``1e-08``, a * - ``B1AeroPwr`` - identical - ElastoDyn + AeroDyn + * - ``B1Azimuth`` + - identical + - ElastoDyn + AeroDyn * - ``B1FldFz`` - identical - MHK buoyancy @@ -2750,6 +2753,9 @@ Measured at a relative tolerance of ``0.005`` with a noise floor of ``1e-08``, a * - ``B2AeroPwr`` - identical - ElastoDyn + AeroDyn + * - ``B2Azimuth`` + - identical + - ElastoDyn + AeroDyn * - ``B2FldMx`` - sign-flipped - MHK buoyancy @@ -2810,6 +2816,9 @@ Measured at a relative tolerance of ``0.005`` with a noise floor of ``1e-08``, a * - ``B3AeroPwr`` - identical - ElastoDyn + AeroDyn + * - ``B3Azimuth`` + - identical + - ElastoDyn + AeroDyn * - ``B3N3Clrnc`` - identical - Twin-rotor semisubmersible diff --git a/docs/source/user/glue-code/mirror_rotor_sign_map.yaml b/docs/source/user/glue-code/mirror_rotor_sign_map.yaml index 57ffd47afb..11d5c0d38b 100644 --- a/docs/source/user/glue-code/mirror_rotor_sign_map.yaml +++ b/docs/source/user/glue-code/mirror_rotor_sign_map.yaml @@ -845,6 +845,7 @@ channels: ANCHTEN4: {behaviour: mooring, measured_in: [MHK buoyancy]} Azimuth: {behaviour: S, measured_in: [AeroDisk, yawed, AeroDyn nodal outputs, BeamDyn blades, ElastoDyn + AeroDyn, OLAF free wake, Twin-rotor semisubmersible]} B1AeroPwr: {behaviour: S, measured_in: [ElastoDyn + AeroDyn]} + B1Azimuth: {behaviour: S, measured_in: [ElastoDyn + AeroDyn]} B1FldFz: {behaviour: S, measured_in: [MHK buoyancy]} B1N1Alpha: {behaviour: S, measured_in: [BeamDyn blades, ElastoDyn + AeroDyn]} B1N1Cd: {behaviour: S, measured_in: [ElastoDyn + AeroDyn]} @@ -916,6 +917,7 @@ channels: B1TipTDyr: {behaviour: F, measured_in: [BeamDyn blades]} B1TipTDzr: {behaviour: S, measured_in: [BeamDyn blades]} B2AeroPwr: {behaviour: S, measured_in: [ElastoDyn + AeroDyn]} + B2Azimuth: {behaviour: S, measured_in: [ElastoDyn + AeroDyn]} B2FldMx: {behaviour: F, measured_in: [MHK buoyancy]} B2N3Clrnc: {behaviour: S, measured_in: [Twin-rotor semisubmersible]} B2N3Mbt: {behaviour: S, measured_in: [MHK buoyancy]} @@ -936,6 +938,7 @@ channels: B2TipTDyr: {behaviour: F, measured_in: [BeamDyn blades]} B2TipTDzr: {behaviour: S, measured_in: [BeamDyn blades]} B3AeroPwr: {behaviour: S, measured_in: [ElastoDyn + AeroDyn]} + B3Azimuth: {behaviour: S, measured_in: [ElastoDyn + AeroDyn]} B3N3Clrnc: {behaviour: S, measured_in: [Twin-rotor semisubmersible]} B3RootFxr: {behaviour: S, measured_in: [BeamDyn blades]} B3RootFyr: {behaviour: F, measured_in: [BeamDyn blades]} diff --git a/reg_tests/otherTests/compare_mirror.py b/reg_tests/otherTests/compare_mirror.py index ab76a91585..5fe5dabb2a 100644 --- a/reg_tests/otherTests/compare_mirror.py +++ b/reg_tests/otherTests/compare_mirror.py @@ -36,12 +36,12 @@ "Vdisy", "Vundy"): EXPECT[f"B{_b}N{_n}{_q}"] = "F" -# Reported but not asserted. Per-blade azimuth is a wrapped diagnostic angle whose -# mirror reference depends on blade index and rotor tilt (under tilt it picks up a -# clean 180 deg offset). Whether it mirrors cleanly under the new blade-numbering -# convention is still to be measured before it is asserted. It carries no load -# information, and the rotor-level "Azimuth" channel is asserted. -INFORMATIONAL = [r"^B\d+Azimuth$"] +# Reported but not asserted. Under the old blade numbering the per-blade azimuth's +# mirror reference depended on blade index and rotor tilt, so B*Azimuth sat here. +# With the blades numbered in the direction of rotation it measures as identical +# (class S) across every registered pair -- 2026-09-30, emit_sign_table at +# tol 5e-3 -- so it is asserted like any other channel and this list is empty. +INFORMATIONAL = [] def load(path): From 0f024b7f381c80ecca5f0e1c40362c9b0df08a04 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Wed, 30 Sep 2026 14:11:50 -0600 Subject: [PATCH 65/66] Fold the sign map page into the pull request, add the flag flow chart The rendered per-channel sign map page is retired. At 1206 rows it was too long to read as documentation, and its audience is really the reviewer of the pull request, so the full listing now travels with the pull request text instead. The YAML stays as the machine-readable artefact, generated by emit_sign_table.py --emit-map and downloadable from the mirror rotor page; the emitter no longer writes the reStructuredText page, so a future regeneration cannot resurrect it, and the otherTests README now describes what the tool actually writes. The measured sign table on the mirror rotor page is trimmed for the same reason: the identical channels are gone -- everything not listed measures identical, and the YAML holds the complete classification -- and the sign-flipped listing is grouped into the physical families that flip (lateral y quantities, x- and z-axis pseudovector components, physical-frame shaft channels, aerodynamic in-plane families, rotor-aggregate laterals, AeroDisk, marine-turbine buoyancy) with representative channels rather than exhaustive lists. The page also gains a mermaid flow chart of what changes when the flag is set, from the primary input through each module to the refused combinations, with the untouched physics kernels alongside; sphinxcontrib.mermaid is already in the Sphinx configuration, so it renders with no new dependency. The AeroDyn driver documentation states which geometry format spaces the blades itself, and the aggregate counts follow the 2026-09-30 measurement. Assisted-by: Claude Fable 5 --- docs/source/user/glue-code/index.rst | 1 - docs/source/user/glue-code/mirror_rotor.rst | 128 +- .../user/glue-code/mirror_rotor_sign_map.rst | 3667 ----------------- reg_tests/otherTests/README.md | 2 +- reg_tests/otherTests/emit_sign_table.py | 74 +- 5 files changed, 80 insertions(+), 3792 deletions(-) delete mode 100644 docs/source/user/glue-code/mirror_rotor_sign_map.rst diff --git a/docs/source/user/glue-code/index.rst b/docs/source/user/glue-code/index.rst index 7e7f81c2b9..3186107aff 100644 --- a/docs/source/user/glue-code/index.rst +++ b/docs/source/user/glue-code/index.rst @@ -16,5 +16,4 @@ the glue code from a user and module-developer perspective. modglue solver mirror_rotor - mirror_rotor_sign_map linearization diff --git a/docs/source/user/glue-code/mirror_rotor.rst b/docs/source/user/glue-code/mirror_rotor.rst index 8124809de9..a123d8249d 100644 --- a/docs/source/user/glue-code/mirror_rotor.rst +++ b/docs/source/user/glue-code/mirror_rotor.rst @@ -70,6 +70,36 @@ out. Inside ElastoDyn the azimuth and rotor speed states are the **physical** ones, so a mirrored rotor really does have a negative shaft speed about the :math:`+x` axis. +The flow of the flag through the code, and what changes where: + +.. mermaid:: + + flowchart TD + FST["OpenFAST primary input
MirrorRotor = T (per rotor)"] --> GLUE["Glue code
hands the flag to each module at Init"] + + GLUE --> ED["ElastoDyn /
Simplified-ElastoDyn"] + GLUE --> AD["AeroDyn"] + GLUE --> BD["BeamDyn"] + GLUE --> SRV["ServoDyn + DLL"] + GLUE --> X["Refused combinations"] + GLUE -.-> K["Physics kernels unchanged:
BEMT, UA, DBEMT, AirfoilInfo,
BD finite elements, HydroDyn, MoorDyn;
airfoil polars used verbatim"] + + ED --> ED1["Azimuth, rotor speed and
acceleration reversed"] + ED --> ED2["Blade spacing carries the rotation
sense: blades numbered in the
direction of rotation"] + ED --> ED3["Rotor-convention channels and pitch
presented in the clockwise convention
at the boundary"] + + AD --> AD1["Per-blade azimuth taken from
the mirrored root meshes"] + AD --> AD2["Angle of attack in the clockwise-
equivalent airfoil frame"] + AD --> AD3["OLAF: bound circulation sign and
lifting-line LE/TE mirrored per wing —
mixed CW/mirrored rotors share one wake"] + AD --> AD4["AeroDisk: lateral force and
moment components signed"] + AD --> AD5["VTK blade surfaces: airfoil section
drawn as its mirror image"] + + BD --> BD1["Blade mass/stiffness transformed on
read: M' = T M T', T = diag(1,-1,1,-1,1,-1)
root motion follows ElastoDyn"] + + SRV --> SRV1["Sees the clockwise convention —
no controller change; yaw untouched
(inertial-frame quantity)"] + + X --> X1["Linearization · aero-map solver ·
ExtLoads · FAST.Farm · AeroAcoustics:
fatal error at Init"] + .. _glue-code-mirror-rotor-where: Where the mirror is applied @@ -340,58 +370,45 @@ tower, support structure and inflow are not mirrored, so a quantity such as ``TwrBsMxt`` is simply the response of an unchanged structure to a counter-clockwise rotor. +The table lists only what **changes** between the two runs of the symmetric +comparison, grouped by the physical rule that flips each family. Every channel +not listed here measures **identical**; the complete per-channel classification +of all 1206 channels, identical ones included, is generated as +:download:`mirror_rotor_sign_map.yaml `. + .. list-table:: :header-rows: 1 - :widths: 20 80 - - * - Behaviour - - Channels - * - Identical - - ``RotSpeed``, ``RotAccel``, ``Azimuth``, ``RotTorq``, ``LSShftTq``, - ``RotPwr``, ``RotThrust``, ``GenSpeed``, ``GenAccel``, ``GenTq``, - ``GenPwr``, ``HSShftTq``, ``HSShftPwr``, ``LSShftFxa``, ``LSShftFza``, - ``LSSTipMya``, ``LSSGagMya``, ``YawBrFxp``, ``YawBrFzp``, ``YawBrMyp``, - ``TwrBsFxt``, ``TwrBsFzt``, ``TwrBsMyt``, ``TTDspFA``, ``TwrTpTDxi``, - ``TwrTpTDzi``, ``NcIMUTAxs``, ``NcIMUTAzs``, ``PtfmSurge``, - ``PtfmHeave``, ``PtfmPitch``, ``HydroFxi``, ``HydroFzi``, - ``OoPDefl*``, ``TipDxc*``, ``RootFxc*``, ``RootFzc*``, ``RootMyc*``, - ``RootFxb*``, ``RootFzb*``, ``RootMyb*``; - the BeamDyn ``B*RootFxr``, ``B*RootFzr``, ``B*RootMyr``, ``B*TipTDxr``, - ``B*TipTDzr``, ``B*TipRDyr``, ``B*FldFz`` families; - the AeroDyn ``*Alpha``, ``*Theta``, ``*Phi``, ``*Fn``, ``*Fl``, - ``*Fd``, ``*Fx``, ``*Cl``, ``*Cd``, ``*Cx``, ``*Cn``, ``*Vrel``, - ``*Vindx``, ``*AxInd``, ``*TnInd``, ``*Gam``, ``*VUndx``, - ``*VDisx`` families, in both the module (``B1N001Fn``) and nodal - (``AB1N001Fn``) forms; - the per-blade ``B*AeroPwr``; - the AeroDisk ``ADFx``, ``ADFy``, ``ADFz``, ``ADFxi``, ``ADFzi``, - ``ADMyi``, ``ADCp``, ``ADCq``, ``ADCt``, ``ADPower``, ``ADSkew``, - ``ADTSR``, ``ADVRel`` channels; - ``RtAeroFxh``, ``RtAeroFzh``, ``RtAeroMyh``, ``RtAeroPwr``, - ``RtAeroCp``, ``RtAeroCt``, ``RtArea``, ``RtSkew``, ``RtTSR``, - ``RtSpeed``, ``RtVAvgxh``, ``RtVAvgzh``, ``RtFldFxh``, ``RtFldFzg``, - ``RtFldMyg``; and for a marine turbine the buoyant ``*Fbn``, ``*Fbs``, - ``*Mbt``, ``HbFbx``, ``HbFbz``, ``HbMby`` families together with - ``*SgCav``, ``*SigCr`` and ``*Clrnc`` - * - Sign-flipped - - ``LSShftMxa``, ``LSShftFya``, ``LSSTipMza``, ``LSSGagMxa``, - ``LSSGagMza``, ``LSSTipVxa``, ``LSSTipAxa``, ``YawBrFyp``, - ``YawBrMxp``, ``YawBrMzp``, ``TwrBsFyt``, ``TwrBsMxt``, ``TwrBsMzt``, - ``TTDspSS``, ``TwrTpTDyi``, ``NcIMUTAys``, ``PtfmSway``, ``PtfmRoll``, - ``PtfmYaw``, ``HydroFyi``, - ``IPDefl*``, ``TipDyc*``, ``RootFyc*``, ``RootMxc*``, ``RootMzc*``, - ``RootFyb*``, ``RootMxb*``, ``RootMzb*``; - the BeamDyn ``B*RootFyr``, ``B*RootMxr``, ``B*RootMzr``, ``B*TipTDyr``, - ``B*TipRDxr``, ``B*TipRDzr``, ``B*FldMx`` families; - the AeroDyn ``*Ft``, ``*Fy``, ``*Cy``, ``*Cm``, ``*Ct``, ``*Vindy``, - ``*STVy``, ``*Mm`` families, again in both the module and nodal forms; - the AeroDisk ``ADMx``, ``ADMy``, ``ADMz``, ``ADFyi``, ``ADMxi``, - ``ADMzi``, ``ADSpeed`` channels; - ``RtAeroFyh``, ``RtAeroMxh``, ``RtAeroMzh``, ``RtAeroCq``, - ``RtVAvgyh``, ``RtFldFyh``, ``RtFldMxh``, ``RtFldMzh``; and for a - marine turbine the buoyant ``*Fbt``, ``*Mbn``, ``*Mbs``, ``HbFby``, - ``HbMbx``, ``HbMbz`` families - * - Mirrored angle + :widths: 35 65 + + * - Sign-flipped family + - Representative channels + * - Lateral (:math:`y`) structural forces, deflections, velocities and + accelerations — the mirrored axis itself + - ``LSShftFya``, ``YawBrFyp``, ``TwrBsFyt``, ``TTDspSS``, ``TwrTpTDyi``, + ``NcIMUTAys``, ``PtfmSway``, ``HydroFyi``, ``IPDefl*``, ``TipDyc*``, + ``RootFyc*``, ``RootFyb*``, BeamDyn ``B*RootFyr`` and ``B*TipTDyr`` + * - Moments and rotations about the :math:`x`- and :math:`z`-axes — + pseudovector components in the mirror plane + - ``TwrBsMxt``, ``TwrBsMzt``, ``YawBrMxp``, ``YawBrMzp``, ``PtfmRoll``, + ``PtfmYaw``, ``RootMxc*``, ``RootMzc*``, ``RootMxb*``, ``RootMzb*``, + BeamDyn ``B*RootMxr``, ``B*RootMzr``, ``B*TipRDxr``, ``B*TipRDzr`` + * - Shaft quantities in the physical ``xa``/``xs`` frames (the + rotor-convention twins ``RotSpeed``, ``RotTorq`` etc. stay identical) + - ``LSSTipVxa``, ``LSSTipAxa``, ``LSShftMxa``, ``LSShftFya``, + ``LSSTipMza``, ``LSSGagMxa``, ``LSSGagMza`` + * - Aerodynamic tangential and in-plane families, in both the module + (``B1N001Ft``) and nodal (``AB1N001Ft``) forms + - ``*Ft``, ``*Fy``, ``*Cy``, ``*Cm``, ``*Ct``, ``*Mm``, ``*Vindy``, + ``*STVy``, ``*VUndy``, ``*VDisy`` + * - Rotor-aggregate lateral loads and inflow + - ``RtAeroFyh``, ``RtAeroMxh``, ``RtAeroMzh``, ``RtAeroCq``, + ``RtVAvgyh``, ``RtFldFyh``, ``RtFldMxh``, ``RtFldMzh`` + * - AeroDisk lateral loads and speed + - ``ADFyi``, ``ADMx``, ``ADMy``, ``ADMz``, ``ADMxi``, ``ADMzi``, + ``ADSpeed`` + * - Marine-turbine buoyancy, tangential and moment components + - ``*Fbt``, ``*Mbn``, ``*Mbs``, ``HbFby``, ``HbMbx``, ``HbMbz`` + * - **Mirrored angle** (:math:`v' = -v`, wrapped) - ``LSSTipPxa``, ``LSSGagPxa`` Every channel that carries a mirror sign in the code is now requested by at @@ -406,11 +423,12 @@ and one mirrored angle, with a further 55 below the noise floor in every case an 133 mooring channels set aside because their pairing is layout-specific. No channel is unresolved. -The grouped form above is the one to read. The complete per-channel map, listing -all 1206 channels alphabetically with the pairs each was measured in, is at -:ref:`glue-code-mirror-rotor-sign-map`; the same data is available as -``mirror_rotor_sign_map.yaml`` for anything that wants to consume it. Both are -generated by the same measurement and neither should be edited by hand. +The grouped form above is the one to read. The complete per-channel map, +listing all 1206 channels alphabetically with the pairs each was measured in, +is generated by the same measurement as +:download:`mirror_rotor_sign_map.yaml ` — run +``reg_tests/otherTests/emit_sign_table.py --tol 0.005 --emit-map`` to +regenerate it; it should never be edited by hand. .. _glue-code-mirror-rotor-control: diff --git a/docs/source/user/glue-code/mirror_rotor_sign_map.rst b/docs/source/user/glue-code/mirror_rotor_sign_map.rst deleted file mode 100644 index 33cbae48e6..0000000000 --- a/docs/source/user/glue-code/mirror_rotor_sign_map.rst +++ /dev/null @@ -1,3667 +0,0 @@ -.. _glue-code-mirror-rotor-sign-map: - -Mirror-rotor sign map -===================== - -.. warning:: - This page is **generated**. Do not edit it by hand; regenerate it with - - .. code-block:: bash - - python3 reg_tests/otherTests/emit_sign_table.py --tol 0.005 --emit-map - -Every entry below is **measured**, not asserted. Each registered -clockwise/mirrored pair is run and every output channel is compared against its -counterpart, so this records behaviour that is observed rather than behaviour -expected from reading the source. A channel seen in more than one pair must -agree across them; a disagreement is reported rather than silently resolved. - -The grouped, prose form of the same information is in -:ref:`glue-code-mirror-rotor-verification`, which is the better place to start. -This page exists for looking a single channel up, and for anything that wants to -consume the map as data -- see ``mirror_rotor_sign_map.yaml`` beside this file. - -**Read it correctly.** This records how the two runs of a *symmetric* comparison -relate to each other, which is how the implementation is verified. It is **not** -a claim that these channels change sign whenever the flag is set: in an ordinary -simulation the tower, support structure and inflow are not mirrored, so a -quantity such as ``TwrBsMxt`` is simply the response of an unchanged structure to -a counter-clockwise rotor. - -Blade spacing follows the rotation direction, so a mirrored blade is compared -against the clockwise blade of the same number. Mooring channels are set -aside because which line pairs with which depends on the layout. - -Measured at a relative tolerance of ``0.005`` with a noise floor of ``1e-08``, across 1206 channels. - -* **identical** (689) -- v' = v -* **sign-flipped** (328) -- v' = -v -* **mirrored angle** (1) -- v' = -v, wrapped -* **below the noise floor** (55) -- indistinguishable from zero everywhere -* **set aside** (133) -- mooring, pairing is layout-specific - -.. list-table:: - :header-rows: 1 - :widths: 30 25 45 - - * - Channel - - Behaviour - - Measured in - * - ``AB1N001Alpha`` - - identical - - AeroDyn nodal outputs, OLAF free wake - * - ``AB1N001AxInd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N001Cd`` - - identical - - AeroDyn nodal outputs, OLAF free wake - * - ``AB1N001Cl`` - - identical - - AeroDyn nodal outputs, OLAF free wake - * - ``AB1N001Cm`` - - sign-flipped - - AeroDyn nodal outputs, OLAF free wake - * - ``AB1N001Cn`` - - identical - - AeroDyn nodal outputs, OLAF free wake - * - ``AB1N001Ct`` - - sign-flipped - - AeroDyn nodal outputs, OLAF free wake - * - ``AB1N001Cx`` - - identical - - AeroDyn nodal outputs, OLAF free wake - * - ``AB1N001Cy`` - - sign-flipped - - AeroDyn nodal outputs, OLAF free wake - * - ``AB1N001Fd`` - - identical - - AeroDyn nodal outputs, OLAF free wake - * - ``AB1N001Fl`` - - identical - - AeroDyn nodal outputs, OLAF free wake - * - ``AB1N001Fn`` - - identical - - AeroDyn nodal outputs, OLAF free wake - * - ``AB1N001Ft`` - - sign-flipped - - AeroDyn nodal outputs, OLAF free wake - * - ``AB1N001Fx`` - - below the noise floor - - AeroDyn nodal outputs - * - ``AB1N001Fy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N001Gam`` - - identical - - AeroDyn nodal outputs, OLAF free wake - * - ``AB1N001Mm`` - - below the noise floor - - AeroDyn nodal outputs - * - ``AB1N001Phi`` - - identical - - AeroDyn nodal outputs, OLAF free wake - * - ``AB1N001STVx`` - - below the noise floor - - OLAF free wake - * - ``AB1N001STVy`` - - sign-flipped - - AeroDyn nodal outputs, OLAF free wake - * - ``AB1N001STVz`` - - below the noise floor - - OLAF free wake - * - ``AB1N001Theta`` - - identical - - AeroDyn nodal outputs - * - ``AB1N001TnInd`` - - below the noise floor - - AeroDyn nodal outputs - * - ``AB1N001VDisx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N001Vindx`` - - identical - - AeroDyn nodal outputs, OLAF free wake - * - ``AB1N001Vindy`` - - sign-flipped - - AeroDyn nodal outputs, OLAF free wake - * - ``AB1N001VRel`` - - identical - - OLAF free wake - * - ``AB1N001Vrel`` - - identical - - AeroDyn nodal outputs - * - ``AB1N001VUndx`` - - identical - - AeroDyn nodal outputs, OLAF free wake - * - ``AB1N001VUndy`` - - sign-flipped - - OLAF free wake - * - ``AB1N001VUndz`` - - identical - - OLAF free wake - * - ``AB1N002Alpha`` - - identical - - AeroDyn nodal outputs, OLAF free wake - * - ``AB1N002AxInd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N002Cd`` - - identical - - AeroDyn nodal outputs, OLAF free wake - * - ``AB1N002Cl`` - - identical - - AeroDyn nodal outputs, OLAF free wake - * - ``AB1N002Cm`` - - sign-flipped - - AeroDyn nodal outputs, OLAF free wake - * - ``AB1N002Cn`` - - identical - - AeroDyn nodal outputs, OLAF free wake - * - ``AB1N002Ct`` - - sign-flipped - - AeroDyn nodal outputs, OLAF free wake - * - ``AB1N002Cx`` - - identical - - AeroDyn nodal outputs, OLAF free wake - * - ``AB1N002Cy`` - - sign-flipped - - AeroDyn nodal outputs, OLAF free wake - * - ``AB1N002Fd`` - - identical - - AeroDyn nodal outputs, OLAF free wake - * - ``AB1N002Fl`` - - identical - - AeroDyn nodal outputs, OLAF free wake - * - ``AB1N002Fn`` - - identical - - AeroDyn nodal outputs, OLAF free wake - * - ``AB1N002Ft`` - - sign-flipped - - AeroDyn nodal outputs, OLAF free wake - * - ``AB1N002Fx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N002Fy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N002Gam`` - - identical - - AeroDyn nodal outputs, OLAF free wake - * - ``AB1N002Mm`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N002Phi`` - - identical - - AeroDyn nodal outputs, OLAF free wake - * - ``AB1N002STVx`` - - below the noise floor - - OLAF free wake - * - ``AB1N002STVy`` - - sign-flipped - - AeroDyn nodal outputs, OLAF free wake - * - ``AB1N002STVz`` - - below the noise floor - - OLAF free wake - * - ``AB1N002Theta`` - - identical - - AeroDyn nodal outputs - * - ``AB1N002TnInd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N002VDisx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N002Vindx`` - - identical - - AeroDyn nodal outputs, OLAF free wake - * - ``AB1N002Vindy`` - - sign-flipped - - AeroDyn nodal outputs, OLAF free wake - * - ``AB1N002VRel`` - - identical - - OLAF free wake - * - ``AB1N002Vrel`` - - identical - - AeroDyn nodal outputs - * - ``AB1N002VUndx`` - - identical - - AeroDyn nodal outputs, OLAF free wake - * - ``AB1N002VUndy`` - - sign-flipped - - OLAF free wake - * - ``AB1N002VUndz`` - - identical - - OLAF free wake - * - ``AB1N003Alpha`` - - identical - - AeroDyn nodal outputs - * - ``AB1N003AxInd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N003Cd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N003Cl`` - - identical - - AeroDyn nodal outputs - * - ``AB1N003Cm`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N003Cn`` - - identical - - AeroDyn nodal outputs - * - ``AB1N003Ct`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N003Cx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N003Cy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N003Fd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N003Fl`` - - identical - - AeroDyn nodal outputs - * - ``AB1N003Fn`` - - identical - - AeroDyn nodal outputs - * - ``AB1N003Ft`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N003Fx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N003Fy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N003Gam`` - - identical - - AeroDyn nodal outputs - * - ``AB1N003Mm`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N003Phi`` - - identical - - AeroDyn nodal outputs - * - ``AB1N003STVy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N003Theta`` - - identical - - AeroDyn nodal outputs - * - ``AB1N003TnInd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N003VDisx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N003Vindx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N003Vindy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N003Vrel`` - - identical - - AeroDyn nodal outputs - * - ``AB1N003VUndx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N004Alpha`` - - identical - - AeroDyn nodal outputs - * - ``AB1N004AxInd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N004Cd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N004Cl`` - - identical - - AeroDyn nodal outputs - * - ``AB1N004Cm`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N004Cn`` - - identical - - AeroDyn nodal outputs - * - ``AB1N004Ct`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N004Cx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N004Cy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N004Fd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N004Fl`` - - identical - - AeroDyn nodal outputs - * - ``AB1N004Fn`` - - identical - - AeroDyn nodal outputs - * - ``AB1N004Ft`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N004Fx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N004Fy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N004Gam`` - - identical - - AeroDyn nodal outputs - * - ``AB1N004Mm`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N004Phi`` - - identical - - AeroDyn nodal outputs - * - ``AB1N004STVy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N004Theta`` - - identical - - AeroDyn nodal outputs - * - ``AB1N004TnInd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N004VDisx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N004Vindx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N004Vindy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N004Vrel`` - - identical - - AeroDyn nodal outputs - * - ``AB1N004VUndx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N005Alpha`` - - identical - - AeroDyn nodal outputs - * - ``AB1N005AxInd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N005Cd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N005Cl`` - - identical - - AeroDyn nodal outputs - * - ``AB1N005Cm`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N005Cn`` - - identical - - AeroDyn nodal outputs - * - ``AB1N005Ct`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N005Cx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N005Cy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N005Fd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N005Fl`` - - identical - - AeroDyn nodal outputs - * - ``AB1N005Fn`` - - identical - - AeroDyn nodal outputs - * - ``AB1N005Ft`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N005Fx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N005Fy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N005Gam`` - - identical - - AeroDyn nodal outputs - * - ``AB1N005Mm`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N005Phi`` - - identical - - AeroDyn nodal outputs - * - ``AB1N005STVy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N005Theta`` - - identical - - AeroDyn nodal outputs - * - ``AB1N005TnInd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N005VDisx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N005Vindx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N005Vindy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N005Vrel`` - - identical - - AeroDyn nodal outputs - * - ``AB1N005VUndx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N006Alpha`` - - identical - - AeroDyn nodal outputs - * - ``AB1N006AxInd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N006Cd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N006Cl`` - - identical - - AeroDyn nodal outputs - * - ``AB1N006Cm`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N006Cn`` - - identical - - AeroDyn nodal outputs - * - ``AB1N006Ct`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N006Cx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N006Cy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N006Fd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N006Fl`` - - identical - - AeroDyn nodal outputs - * - ``AB1N006Fn`` - - identical - - AeroDyn nodal outputs - * - ``AB1N006Ft`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N006Fx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N006Fy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N006Gam`` - - identical - - AeroDyn nodal outputs - * - ``AB1N006Mm`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N006Phi`` - - identical - - AeroDyn nodal outputs - * - ``AB1N006STVy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N006Theta`` - - identical - - AeroDyn nodal outputs - * - ``AB1N006TnInd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N006VDisx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N006Vindx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N006Vindy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N006Vrel`` - - identical - - AeroDyn nodal outputs - * - ``AB1N006VUndx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N007Alpha`` - - identical - - AeroDyn nodal outputs - * - ``AB1N007AxInd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N007Cd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N007Cl`` - - identical - - AeroDyn nodal outputs - * - ``AB1N007Cm`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N007Cn`` - - identical - - AeroDyn nodal outputs - * - ``AB1N007Ct`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N007Cx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N007Cy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N007Fd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N007Fl`` - - identical - - AeroDyn nodal outputs - * - ``AB1N007Fn`` - - identical - - AeroDyn nodal outputs - * - ``AB1N007Ft`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N007Fx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N007Fy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N007Gam`` - - identical - - AeroDyn nodal outputs - * - ``AB1N007Mm`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N007Phi`` - - identical - - AeroDyn nodal outputs - * - ``AB1N007STVy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N007Theta`` - - identical - - AeroDyn nodal outputs - * - ``AB1N007TnInd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N007VDisx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N007Vindx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N007Vindy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N007Vrel`` - - identical - - AeroDyn nodal outputs - * - ``AB1N007VUndx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N008Alpha`` - - identical - - AeroDyn nodal outputs - * - ``AB1N008AxInd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N008Cd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N008Cl`` - - identical - - AeroDyn nodal outputs - * - ``AB1N008Cm`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N008Cn`` - - identical - - AeroDyn nodal outputs - * - ``AB1N008Ct`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N008Cx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N008Cy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N008Fd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N008Fl`` - - identical - - AeroDyn nodal outputs - * - ``AB1N008Fn`` - - identical - - AeroDyn nodal outputs - * - ``AB1N008Ft`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N008Fx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N008Fy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N008Gam`` - - identical - - AeroDyn nodal outputs - * - ``AB1N008Mm`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N008Phi`` - - identical - - AeroDyn nodal outputs - * - ``AB1N008STVy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N008Theta`` - - identical - - AeroDyn nodal outputs - * - ``AB1N008TnInd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N008VDisx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N008Vindx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N008Vindy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N008Vrel`` - - identical - - AeroDyn nodal outputs - * - ``AB1N008VUndx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N009Alpha`` - - identical - - AeroDyn nodal outputs - * - ``AB1N009AxInd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N009Cd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N009Cl`` - - identical - - AeroDyn nodal outputs - * - ``AB1N009Cm`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N009Cn`` - - identical - - AeroDyn nodal outputs - * - ``AB1N009Ct`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N009Cx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N009Cy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N009Fd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N009Fl`` - - identical - - AeroDyn nodal outputs - * - ``AB1N009Fn`` - - identical - - AeroDyn nodal outputs - * - ``AB1N009Ft`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N009Fx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N009Fy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N009Gam`` - - identical - - AeroDyn nodal outputs - * - ``AB1N009Mm`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N009Phi`` - - identical - - AeroDyn nodal outputs - * - ``AB1N009STVy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N009Theta`` - - identical - - AeroDyn nodal outputs - * - ``AB1N009TnInd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N009VDisx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N009Vindx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N009Vindy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N009Vrel`` - - identical - - AeroDyn nodal outputs - * - ``AB1N009VUndx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N010Alpha`` - - identical - - AeroDyn nodal outputs - * - ``AB1N010AxInd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N010Cd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N010Cl`` - - identical - - AeroDyn nodal outputs - * - ``AB1N010Cm`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N010Cn`` - - identical - - AeroDyn nodal outputs - * - ``AB1N010Ct`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N010Cx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N010Cy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N010Fd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N010Fl`` - - identical - - AeroDyn nodal outputs - * - ``AB1N010Fn`` - - identical - - AeroDyn nodal outputs - * - ``AB1N010Ft`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N010Fx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N010Fy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N010Gam`` - - identical - - AeroDyn nodal outputs - * - ``AB1N010Mm`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N010Phi`` - - identical - - AeroDyn nodal outputs - * - ``AB1N010STVy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N010Theta`` - - identical - - AeroDyn nodal outputs - * - ``AB1N010TnInd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N010VDisx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N010Vindx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N010Vindy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N010Vrel`` - - identical - - AeroDyn nodal outputs - * - ``AB1N010VUndx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N011Alpha`` - - identical - - AeroDyn nodal outputs - * - ``AB1N011AxInd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N011Cd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N011Cl`` - - identical - - AeroDyn nodal outputs - * - ``AB1N011Cm`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N011Cn`` - - identical - - AeroDyn nodal outputs - * - ``AB1N011Ct`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N011Cx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N011Cy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N011Fd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N011Fl`` - - identical - - AeroDyn nodal outputs - * - ``AB1N011Fn`` - - identical - - AeroDyn nodal outputs - * - ``AB1N011Ft`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N011Fx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N011Fy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N011Gam`` - - identical - - AeroDyn nodal outputs - * - ``AB1N011Mm`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N011Phi`` - - identical - - AeroDyn nodal outputs - * - ``AB1N011STVy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N011Theta`` - - identical - - AeroDyn nodal outputs - * - ``AB1N011TnInd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N011VDisx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N011Vindx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N011Vindy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N011Vrel`` - - identical - - AeroDyn nodal outputs - * - ``AB1N011VUndx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N012Alpha`` - - identical - - AeroDyn nodal outputs - * - ``AB1N012AxInd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N012Cd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N012Cl`` - - identical - - AeroDyn nodal outputs - * - ``AB1N012Cm`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N012Cn`` - - identical - - AeroDyn nodal outputs - * - ``AB1N012Ct`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N012Cx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N012Cy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N012Fd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N012Fl`` - - identical - - AeroDyn nodal outputs - * - ``AB1N012Fn`` - - identical - - AeroDyn nodal outputs - * - ``AB1N012Ft`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N012Fx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N012Fy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N012Gam`` - - identical - - AeroDyn nodal outputs - * - ``AB1N012Mm`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N012Phi`` - - identical - - AeroDyn nodal outputs - * - ``AB1N012STVy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N012Theta`` - - identical - - AeroDyn nodal outputs - * - ``AB1N012TnInd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N012VDisx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N012Vindx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N012Vindy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N012Vrel`` - - identical - - AeroDyn nodal outputs - * - ``AB1N012VUndx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N013Alpha`` - - identical - - AeroDyn nodal outputs - * - ``AB1N013AxInd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N013Cd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N013Cl`` - - identical - - AeroDyn nodal outputs - * - ``AB1N013Cm`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N013Cn`` - - identical - - AeroDyn nodal outputs - * - ``AB1N013Ct`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N013Cx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N013Cy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N013Fd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N013Fl`` - - identical - - AeroDyn nodal outputs - * - ``AB1N013Fn`` - - identical - - AeroDyn nodal outputs - * - ``AB1N013Ft`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N013Fx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N013Fy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N013Gam`` - - identical - - AeroDyn nodal outputs - * - ``AB1N013Mm`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N013Phi`` - - identical - - AeroDyn nodal outputs - * - ``AB1N013STVy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N013Theta`` - - identical - - AeroDyn nodal outputs - * - ``AB1N013TnInd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N013VDisx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N013Vindx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N013Vindy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N013Vrel`` - - identical - - AeroDyn nodal outputs - * - ``AB1N013VUndx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N014Alpha`` - - identical - - AeroDyn nodal outputs - * - ``AB1N014AxInd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N014Cd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N014Cl`` - - identical - - AeroDyn nodal outputs - * - ``AB1N014Cm`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N014Cn`` - - identical - - AeroDyn nodal outputs - * - ``AB1N014Ct`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N014Cx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N014Cy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N014Fd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N014Fl`` - - identical - - AeroDyn nodal outputs - * - ``AB1N014Fn`` - - identical - - AeroDyn nodal outputs - * - ``AB1N014Ft`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N014Fx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N014Fy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N014Gam`` - - identical - - AeroDyn nodal outputs - * - ``AB1N014Mm`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N014Phi`` - - identical - - AeroDyn nodal outputs - * - ``AB1N014STVy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N014Theta`` - - identical - - AeroDyn nodal outputs - * - ``AB1N014TnInd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N014VDisx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N014Vindx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N014Vindy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N014Vrel`` - - identical - - AeroDyn nodal outputs - * - ``AB1N014VUndx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N015Alpha`` - - identical - - AeroDyn nodal outputs - * - ``AB1N015AxInd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N015Cd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N015Cl`` - - identical - - AeroDyn nodal outputs - * - ``AB1N015Cm`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N015Cn`` - - identical - - AeroDyn nodal outputs - * - ``AB1N015Ct`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N015Cx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N015Cy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N015Fd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N015Fl`` - - identical - - AeroDyn nodal outputs - * - ``AB1N015Fn`` - - identical - - AeroDyn nodal outputs - * - ``AB1N015Ft`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N015Fx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N015Fy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N015Gam`` - - identical - - AeroDyn nodal outputs - * - ``AB1N015Mm`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N015Phi`` - - identical - - AeroDyn nodal outputs - * - ``AB1N015STVy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N015Theta`` - - identical - - AeroDyn nodal outputs - * - ``AB1N015TnInd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N015VDisx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N015Vindx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N015Vindy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N015Vrel`` - - identical - - AeroDyn nodal outputs - * - ``AB1N015VUndx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N016Alpha`` - - identical - - AeroDyn nodal outputs - * - ``AB1N016AxInd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N016Cd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N016Cl`` - - identical - - AeroDyn nodal outputs - * - ``AB1N016Cm`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N016Cn`` - - identical - - AeroDyn nodal outputs - * - ``AB1N016Ct`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N016Cx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N016Cy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N016Fd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N016Fl`` - - identical - - AeroDyn nodal outputs - * - ``AB1N016Fn`` - - identical - - AeroDyn nodal outputs - * - ``AB1N016Ft`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N016Fx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N016Fy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N016Gam`` - - identical - - AeroDyn nodal outputs - * - ``AB1N016Mm`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N016Phi`` - - identical - - AeroDyn nodal outputs - * - ``AB1N016STVy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N016Theta`` - - identical - - AeroDyn nodal outputs - * - ``AB1N016TnInd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N016VDisx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N016Vindx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N016Vindy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N016Vrel`` - - identical - - AeroDyn nodal outputs - * - ``AB1N016VUndx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N017Alpha`` - - identical - - AeroDyn nodal outputs - * - ``AB1N017AxInd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N017Cd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N017Cl`` - - identical - - AeroDyn nodal outputs - * - ``AB1N017Cm`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N017Cn`` - - identical - - AeroDyn nodal outputs - * - ``AB1N017Ct`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N017Cx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N017Cy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N017Fd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N017Fl`` - - identical - - AeroDyn nodal outputs - * - ``AB1N017Fn`` - - identical - - AeroDyn nodal outputs - * - ``AB1N017Ft`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N017Fx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N017Fy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N017Gam`` - - identical - - AeroDyn nodal outputs - * - ``AB1N017Mm`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N017Phi`` - - identical - - AeroDyn nodal outputs - * - ``AB1N017STVy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N017Theta`` - - identical - - AeroDyn nodal outputs - * - ``AB1N017TnInd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N017VDisx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N017Vindx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N017Vindy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N017Vrel`` - - identical - - AeroDyn nodal outputs - * - ``AB1N017VUndx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N018Alpha`` - - identical - - AeroDyn nodal outputs - * - ``AB1N018AxInd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N018Cd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N018Cl`` - - identical - - AeroDyn nodal outputs - * - ``AB1N018Cm`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N018Cn`` - - identical - - AeroDyn nodal outputs - * - ``AB1N018Ct`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N018Cx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N018Cy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N018Fd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N018Fl`` - - identical - - AeroDyn nodal outputs - * - ``AB1N018Fn`` - - identical - - AeroDyn nodal outputs - * - ``AB1N018Ft`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N018Fx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N018Fy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N018Gam`` - - identical - - AeroDyn nodal outputs - * - ``AB1N018Mm`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N018Phi`` - - identical - - AeroDyn nodal outputs - * - ``AB1N018STVy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N018Theta`` - - identical - - AeroDyn nodal outputs - * - ``AB1N018TnInd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N018VDisx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N018Vindx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N018Vindy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N018Vrel`` - - identical - - AeroDyn nodal outputs - * - ``AB1N018VUndx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N019Alpha`` - - identical - - AeroDyn nodal outputs - * - ``AB1N019AxInd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N019Cd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N019Cl`` - - identical - - AeroDyn nodal outputs - * - ``AB1N019Cm`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N019Cn`` - - identical - - AeroDyn nodal outputs - * - ``AB1N019Ct`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N019Cx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N019Cy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N019Fd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N019Fl`` - - identical - - AeroDyn nodal outputs - * - ``AB1N019Fn`` - - identical - - AeroDyn nodal outputs - * - ``AB1N019Ft`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N019Fx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N019Fy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N019Gam`` - - identical - - AeroDyn nodal outputs - * - ``AB1N019Mm`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N019Phi`` - - identical - - AeroDyn nodal outputs - * - ``AB1N019STVy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N019Theta`` - - identical - - AeroDyn nodal outputs - * - ``AB1N019TnInd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N019VDisx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N019Vindx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N019Vindy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N019Vrel`` - - identical - - AeroDyn nodal outputs - * - ``AB1N019VUndx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N020Alpha`` - - identical - - AeroDyn nodal outputs - * - ``AB1N020AxInd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N020Cd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N020Cl`` - - identical - - AeroDyn nodal outputs - * - ``AB1N020Cm`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N020Cn`` - - identical - - AeroDyn nodal outputs - * - ``AB1N020Ct`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N020Cx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N020Cy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N020Fd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N020Fl`` - - identical - - AeroDyn nodal outputs - * - ``AB1N020Fn`` - - identical - - AeroDyn nodal outputs - * - ``AB1N020Ft`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N020Fx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N020Fy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N020Gam`` - - identical - - AeroDyn nodal outputs - * - ``AB1N020Mm`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N020Phi`` - - identical - - AeroDyn nodal outputs - * - ``AB1N020STVy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N020Theta`` - - identical - - AeroDyn nodal outputs - * - ``AB1N020TnInd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N020VDisx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N020Vindx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N020Vindy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N020Vrel`` - - identical - - AeroDyn nodal outputs - * - ``AB1N020VUndx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N021Alpha`` - - identical - - AeroDyn nodal outputs - * - ``AB1N021AxInd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N021Cd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N021Cl`` - - identical - - AeroDyn nodal outputs - * - ``AB1N021Cm`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N021Cn`` - - identical - - AeroDyn nodal outputs - * - ``AB1N021Ct`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N021Cx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N021Cy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N021Fd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N021Fl`` - - identical - - AeroDyn nodal outputs - * - ``AB1N021Fn`` - - identical - - AeroDyn nodal outputs - * - ``AB1N021Ft`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N021Fx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N021Fy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N021Gam`` - - identical - - AeroDyn nodal outputs - * - ``AB1N021Mm`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N021Phi`` - - identical - - AeroDyn nodal outputs - * - ``AB1N021STVy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N021Theta`` - - identical - - AeroDyn nodal outputs - * - ``AB1N021TnInd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N021VDisx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N021Vindx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N021Vindy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N021Vrel`` - - identical - - AeroDyn nodal outputs - * - ``AB1N021VUndx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N022Alpha`` - - identical - - AeroDyn nodal outputs - * - ``AB1N022AxInd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N022Cd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N022Cl`` - - identical - - AeroDyn nodal outputs - * - ``AB1N022Cm`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N022Cn`` - - identical - - AeroDyn nodal outputs - * - ``AB1N022Ct`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N022Cx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N022Cy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N022Fd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N022Fl`` - - identical - - AeroDyn nodal outputs - * - ``AB1N022Fn`` - - identical - - AeroDyn nodal outputs - * - ``AB1N022Ft`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N022Fx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N022Fy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N022Gam`` - - identical - - AeroDyn nodal outputs - * - ``AB1N022Mm`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N022Phi`` - - identical - - AeroDyn nodal outputs - * - ``AB1N022STVy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N022Theta`` - - identical - - AeroDyn nodal outputs - * - ``AB1N022TnInd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N022VDisx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N022Vindx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N022Vindy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N022Vrel`` - - identical - - AeroDyn nodal outputs - * - ``AB1N022VUndx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N023Alpha`` - - identical - - AeroDyn nodal outputs - * - ``AB1N023AxInd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N023Cd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N023Cl`` - - identical - - AeroDyn nodal outputs - * - ``AB1N023Cm`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N023Cn`` - - identical - - AeroDyn nodal outputs - * - ``AB1N023Ct`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N023Cx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N023Cy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N023Fd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N023Fl`` - - identical - - AeroDyn nodal outputs - * - ``AB1N023Fn`` - - identical - - AeroDyn nodal outputs - * - ``AB1N023Ft`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N023Fx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N023Fy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N023Gam`` - - identical - - AeroDyn nodal outputs - * - ``AB1N023Mm`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N023Phi`` - - identical - - AeroDyn nodal outputs - * - ``AB1N023STVy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N023Theta`` - - identical - - AeroDyn nodal outputs - * - ``AB1N023TnInd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N023VDisx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N023Vindx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N023Vindy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N023Vrel`` - - identical - - AeroDyn nodal outputs - * - ``AB1N023VUndx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N024Alpha`` - - identical - - AeroDyn nodal outputs - * - ``AB1N024AxInd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N024Cd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N024Cl`` - - identical - - AeroDyn nodal outputs - * - ``AB1N024Cm`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N024Cn`` - - identical - - AeroDyn nodal outputs - * - ``AB1N024Ct`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N024Cx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N024Cy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N024Fd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N024Fl`` - - identical - - AeroDyn nodal outputs - * - ``AB1N024Fn`` - - identical - - AeroDyn nodal outputs - * - ``AB1N024Ft`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N024Fx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N024Fy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N024Gam`` - - identical - - AeroDyn nodal outputs - * - ``AB1N024Mm`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N024Phi`` - - identical - - AeroDyn nodal outputs - * - ``AB1N024STVy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N024Theta`` - - identical - - AeroDyn nodal outputs - * - ``AB1N024TnInd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N024VDisx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N024Vindx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N024Vindy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N024Vrel`` - - identical - - AeroDyn nodal outputs - * - ``AB1N024VUndx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N025Alpha`` - - identical - - AeroDyn nodal outputs - * - ``AB1N025AxInd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N025Cd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N025Cl`` - - identical - - AeroDyn nodal outputs - * - ``AB1N025Cm`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N025Cn`` - - identical - - AeroDyn nodal outputs - * - ``AB1N025Ct`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N025Cx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N025Cy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N025Fd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N025Fl`` - - identical - - AeroDyn nodal outputs - * - ``AB1N025Fn`` - - identical - - AeroDyn nodal outputs - * - ``AB1N025Ft`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N025Fx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N025Fy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N025Gam`` - - identical - - AeroDyn nodal outputs - * - ``AB1N025Mm`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N025Phi`` - - identical - - AeroDyn nodal outputs - * - ``AB1N025STVy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N025Theta`` - - identical - - AeroDyn nodal outputs - * - ``AB1N025TnInd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N025VDisx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N025Vindx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N025Vindy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N025Vrel`` - - identical - - AeroDyn nodal outputs - * - ``AB1N025VUndx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N026Alpha`` - - identical - - AeroDyn nodal outputs - * - ``AB1N026AxInd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N026Cd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N026Cl`` - - identical - - AeroDyn nodal outputs - * - ``AB1N026Cm`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N026Cn`` - - identical - - AeroDyn nodal outputs - * - ``AB1N026Ct`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N026Cx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N026Cy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N026Fd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N026Fl`` - - identical - - AeroDyn nodal outputs - * - ``AB1N026Fn`` - - identical - - AeroDyn nodal outputs - * - ``AB1N026Ft`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N026Fx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N026Fy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N026Gam`` - - identical - - AeroDyn nodal outputs - * - ``AB1N026Mm`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N026Phi`` - - identical - - AeroDyn nodal outputs - * - ``AB1N026STVy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N026Theta`` - - identical - - AeroDyn nodal outputs - * - ``AB1N026TnInd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N026VDisx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N026Vindx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N026Vindy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N026Vrel`` - - identical - - AeroDyn nodal outputs - * - ``AB1N026VUndx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N027Alpha`` - - identical - - AeroDyn nodal outputs - * - ``AB1N027AxInd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N027Cd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N027Cl`` - - identical - - AeroDyn nodal outputs - * - ``AB1N027Cm`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N027Cn`` - - identical - - AeroDyn nodal outputs - * - ``AB1N027Ct`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N027Cx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N027Cy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N027Fd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N027Fl`` - - identical - - AeroDyn nodal outputs - * - ``AB1N027Fn`` - - identical - - AeroDyn nodal outputs - * - ``AB1N027Ft`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N027Fx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N027Fy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N027Gam`` - - identical - - AeroDyn nodal outputs - * - ``AB1N027Mm`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N027Phi`` - - identical - - AeroDyn nodal outputs - * - ``AB1N027STVy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N027Theta`` - - identical - - AeroDyn nodal outputs - * - ``AB1N027TnInd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N027VDisx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N027Vindx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N027Vindy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N027Vrel`` - - identical - - AeroDyn nodal outputs - * - ``AB1N027VUndx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N028Alpha`` - - identical - - AeroDyn nodal outputs - * - ``AB1N028AxInd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N028Cd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N028Cl`` - - identical - - AeroDyn nodal outputs - * - ``AB1N028Cm`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N028Cn`` - - identical - - AeroDyn nodal outputs - * - ``AB1N028Ct`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N028Cx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N028Cy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N028Fd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N028Fl`` - - identical - - AeroDyn nodal outputs - * - ``AB1N028Fn`` - - identical - - AeroDyn nodal outputs - * - ``AB1N028Ft`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N028Fx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N028Fy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N028Gam`` - - identical - - AeroDyn nodal outputs - * - ``AB1N028Mm`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N028Phi`` - - identical - - AeroDyn nodal outputs - * - ``AB1N028STVy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N028Theta`` - - identical - - AeroDyn nodal outputs - * - ``AB1N028TnInd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N028VDisx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N028Vindx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N028Vindy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N028Vrel`` - - identical - - AeroDyn nodal outputs - * - ``AB1N028VUndx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N029Alpha`` - - identical - - AeroDyn nodal outputs - * - ``AB1N029AxInd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N029Cd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N029Cl`` - - identical - - AeroDyn nodal outputs - * - ``AB1N029Cm`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N029Cn`` - - identical - - AeroDyn nodal outputs - * - ``AB1N029Ct`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N029Cx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N029Cy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N029Fd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N029Fl`` - - identical - - AeroDyn nodal outputs - * - ``AB1N029Fn`` - - identical - - AeroDyn nodal outputs - * - ``AB1N029Ft`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N029Fx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N029Fy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N029Gam`` - - identical - - AeroDyn nodal outputs - * - ``AB1N029Mm`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N029Phi`` - - identical - - AeroDyn nodal outputs - * - ``AB1N029STVy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N029Theta`` - - identical - - AeroDyn nodal outputs - * - ``AB1N029TnInd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N029VDisx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N029Vindx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N029Vindy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N029Vrel`` - - identical - - AeroDyn nodal outputs - * - ``AB1N029VUndx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N030Alpha`` - - identical - - AeroDyn nodal outputs - * - ``AB1N030AxInd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N030Cd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N030Cl`` - - identical - - AeroDyn nodal outputs - * - ``AB1N030Cm`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N030Cn`` - - identical - - AeroDyn nodal outputs - * - ``AB1N030Ct`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N030Cx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N030Cy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N030Fd`` - - identical - - AeroDyn nodal outputs - * - ``AB1N030Fl`` - - identical - - AeroDyn nodal outputs - * - ``AB1N030Fn`` - - identical - - AeroDyn nodal outputs - * - ``AB1N030Ft`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N030Fx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N030Fy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N030Gam`` - - identical - - AeroDyn nodal outputs - * - ``AB1N030Mm`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N030Phi`` - - below the noise floor - - AeroDyn nodal outputs - * - ``AB1N030STVy`` - - sign-flipped - - AeroDyn nodal outputs - * - ``AB1N030Theta`` - - identical - - AeroDyn nodal outputs - * - ``AB1N030TnInd`` - - below the noise floor - - AeroDyn nodal outputs - * - ``AB1N030VDisx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N030Vindx`` - - identical - - AeroDyn nodal outputs - * - ``AB1N030Vindy`` - - below the noise floor - - AeroDyn nodal outputs - * - ``AB1N030Vrel`` - - identical - - AeroDyn nodal outputs - * - ``AB1N030VUndx`` - - identical - - AeroDyn nodal outputs - * - ``ADCp`` - - identical - - AeroDisk, yawed - * - ``ADCq`` - - identical - - AeroDisk, yawed - * - ``ADCt`` - - identical - - AeroDisk, yawed - * - ``ADFx`` - - identical - - AeroDisk, yawed - * - ``ADFxi`` - - identical - - AeroDisk, yawed - * - ``ADFy`` - - identical - - AeroDisk, yawed - * - ``ADFyi`` - - sign-flipped - - AeroDisk, yawed - * - ``ADFz`` - - identical - - AeroDisk, yawed - * - ``ADFzi`` - - identical - - AeroDisk, yawed - * - ``ADMx`` - - sign-flipped - - AeroDisk, yawed - * - ``ADMxi`` - - sign-flipped - - AeroDisk, yawed - * - ``ADMy`` - - sign-flipped - - AeroDisk, yawed - * - ``ADMyi`` - - identical - - AeroDisk, yawed - * - ``ADMz`` - - sign-flipped - - AeroDisk, yawed - * - ``ADMzi`` - - sign-flipped - - AeroDisk, yawed - * - ``ADPitch`` - - below the noise floor - - AeroDisk, yawed - * - ``ADPower`` - - identical - - AeroDisk, yawed - * - ``ADSkew`` - - identical - - AeroDisk, yawed - * - ``ADSpeed`` - - sign-flipped - - AeroDisk, yawed - * - ``ADSTVx`` - - below the noise floor - - AeroDisk, yawed - * - ``ADSTVxi`` - - below the noise floor - - AeroDisk, yawed - * - ``ADSTVy`` - - below the noise floor - - AeroDisk, yawed - * - ``ADSTVyi`` - - below the noise floor - - AeroDisk, yawed - * - ``ADSTVz`` - - below the noise floor - - AeroDisk, yawed - * - ``ADSTVzi`` - - below the noise floor - - AeroDisk, yawed - * - ``ADTSR`` - - identical - - AeroDisk, yawed - * - ``ADVRel`` - - identical - - AeroDisk, yawed - * - ``ADVWindx`` - - identical - - AeroDisk, yawed - * - ``ADVWindxi`` - - identical - - AeroDisk, yawed - * - ``ADVWindy`` - - identical - - AeroDisk, yawed - * - ``ADVWindyi`` - - below the noise floor - - AeroDisk, yawed - * - ``ADVWindz`` - - below the noise floor - - AeroDisk, yawed - * - ``ADVWindzi`` - - below the noise floor - - AeroDisk, yawed - * - ``ADYawErr`` - - below the noise floor - - AeroDisk, yawed - * - ``ANCHTEN1`` - - set aside, layout-specific - - MHK buoyancy - * - ``ANCHTEN2`` - - set aside, layout-specific - - MHK buoyancy - * - ``ANCHTEN3`` - - set aside, layout-specific - - MHK buoyancy - * - ``ANCHTEN4`` - - set aside, layout-specific - - MHK buoyancy - * - ``Azimuth`` - - identical - - AeroDisk, yawed, AeroDyn nodal outputs, BeamDyn blades, ElastoDyn + AeroDyn, OLAF free wake, Twin-rotor semisubmersible - * - ``B1AeroPwr`` - - identical - - ElastoDyn + AeroDyn - * - ``B1Azimuth`` - - identical - - ElastoDyn + AeroDyn - * - ``B1FldFz`` - - identical - - MHK buoyancy - * - ``B1N1Alpha`` - - identical - - BeamDyn blades, ElastoDyn + AeroDyn - * - ``B1N1Cd`` - - identical - - ElastoDyn + AeroDyn - * - ``B1N1Cl`` - - below the noise floor - - ElastoDyn + AeroDyn - * - ``B1N1Cm`` - - below the noise floor - - ElastoDyn + AeroDyn - * - ``B1N1Cn`` - - identical - - ElastoDyn + AeroDyn - * - ``B1N1Ct`` - - sign-flipped - - ElastoDyn + AeroDyn - * - ``B1N1Cx`` - - below the noise floor - - ElastoDyn + AeroDyn - * - ``B1N1Cy`` - - sign-flipped - - ElastoDyn + AeroDyn - * - ``B1N1Fd`` - - identical - - ElastoDyn + AeroDyn - * - ``B1N1Fl`` - - below the noise floor - - ElastoDyn + AeroDyn - * - ``B1N1Fn`` - - identical - - BeamDyn blades, ElastoDyn + AeroDyn - * - ``B1N1Ft`` - - sign-flipped - - BeamDyn blades, ElastoDyn + AeroDyn - * - ``B1N1Fx`` - - below the noise floor - - ElastoDyn + AeroDyn - * - ``B1N1Fy`` - - sign-flipped - - ElastoDyn + AeroDyn - * - ``B1N1Theta`` - - identical - - BeamDyn blades, ElastoDyn + AeroDyn - * - ``B1N1VIndx`` - - identical - - ElastoDyn + AeroDyn - * - ``B1N1VIndy`` - - below the noise floor - - ElastoDyn + AeroDyn - * - ``B1N2Alpha`` - - identical - - BeamDyn blades, ElastoDyn + AeroDyn - * - ``B1N2Cd`` - - identical - - ElastoDyn + AeroDyn - * - ``B1N2Cl`` - - identical - - ElastoDyn + AeroDyn - * - ``B1N2Cm`` - - sign-flipped - - ElastoDyn + AeroDyn - * - ``B1N2Cn`` - - identical - - ElastoDyn + AeroDyn - * - ``B1N2Ct`` - - sign-flipped - - ElastoDyn + AeroDyn - * - ``B1N2Cx`` - - identical - - ElastoDyn + AeroDyn - * - ``B1N2Cy`` - - sign-flipped - - ElastoDyn + AeroDyn - * - ``B1N2Fd`` - - identical - - ElastoDyn + AeroDyn - * - ``B1N2Fl`` - - identical - - ElastoDyn + AeroDyn - * - ``B1N2Fn`` - - identical - - BeamDyn blades, ElastoDyn + AeroDyn - * - ``B1N2Ft`` - - sign-flipped - - BeamDyn blades, ElastoDyn + AeroDyn - * - ``B1N2Fx`` - - identical - - ElastoDyn + AeroDyn - * - ``B1N2Fy`` - - sign-flipped - - ElastoDyn + AeroDyn - * - ``B1N2Mbn`` - - sign-flipped - - MHK buoyancy - * - ``B1N2SgCav`` - - identical - - MHK buoyancy - * - ``B1N2Theta`` - - identical - - BeamDyn blades, ElastoDyn + AeroDyn - * - ``B1N2VIndx`` - - identical - - ElastoDyn + AeroDyn - * - ``B1N2VIndy`` - - sign-flipped - - ElastoDyn + AeroDyn - * - ``B1N3Alpha`` - - identical - - BeamDyn blades, ElastoDyn + AeroDyn - * - ``B1N3Cd`` - - identical - - ElastoDyn + AeroDyn - * - ``B1N3Cl`` - - identical - - ElastoDyn + AeroDyn - * - ``B1N3Clrnc`` - - identical - - Twin-rotor semisubmersible - * - ``B1N3Cm`` - - sign-flipped - - ElastoDyn + AeroDyn - * - ``B1N3Cn`` - - identical - - ElastoDyn + AeroDyn - * - ``B1N3Ct`` - - sign-flipped - - ElastoDyn + AeroDyn - * - ``B1N3Cx`` - - identical - - ElastoDyn + AeroDyn - * - ``B1N3Cy`` - - sign-flipped - - ElastoDyn + AeroDyn - * - ``B1N3Fd`` - - identical - - ElastoDyn + AeroDyn - * - ``B1N3Fl`` - - identical - - ElastoDyn + AeroDyn - * - ``B1N3Fn`` - - identical - - BeamDyn blades, ElastoDyn + AeroDyn - * - ``B1N3Ft`` - - sign-flipped - - BeamDyn blades, ElastoDyn + AeroDyn - * - ``B1N3Fx`` - - identical - - ElastoDyn + AeroDyn - * - ``B1N3Fy`` - - sign-flipped - - ElastoDyn + AeroDyn - * - ``B1N3SigCr`` - - identical - - MHK buoyancy - * - ``B1N3Theta`` - - identical - - BeamDyn blades, ElastoDyn + AeroDyn - * - ``B1N3VIndx`` - - identical - - ElastoDyn + AeroDyn - * - ``B1N3VIndy`` - - below the noise floor - - ElastoDyn + AeroDyn - * - ``B1N6Mbs`` - - sign-flipped - - MHK buoyancy - * - ``B1N7Fbt`` - - sign-flipped - - MHK buoyancy - * - ``B1RootFxr`` - - identical - - BeamDyn blades - * - ``B1RootFyr`` - - sign-flipped - - BeamDyn blades - * - ``B1RootFzr`` - - identical - - BeamDyn blades - * - ``B1RootMxr`` - - sign-flipped - - BeamDyn blades - * - ``B1RootMyr`` - - identical - - BeamDyn blades - * - ``B1RootMzr`` - - sign-flipped - - BeamDyn blades - * - ``B1TipRDxr`` - - sign-flipped - - BeamDyn blades - * - ``B1TipRDyr`` - - identical - - BeamDyn blades - * - ``B1TipRDzr`` - - sign-flipped - - BeamDyn blades - * - ``B1TipTDxr`` - - identical - - BeamDyn blades - * - ``B1TipTDyr`` - - sign-flipped - - BeamDyn blades - * - ``B1TipTDzr`` - - identical - - BeamDyn blades - * - ``B2AeroPwr`` - - identical - - ElastoDyn + AeroDyn - * - ``B2Azimuth`` - - identical - - ElastoDyn + AeroDyn - * - ``B2FldMx`` - - sign-flipped - - MHK buoyancy - * - ``B2N3Clrnc`` - - identical - - Twin-rotor semisubmersible - * - ``B2N3Mbt`` - - identical - - MHK buoyancy - * - ``B2N4Fbn`` - - identical - - MHK buoyancy - * - ``B2N5SigCr`` - - identical - - MHK buoyancy - * - ``B2N6SgCav`` - - identical - - MHK buoyancy - * - ``B2N8Fbs`` - - identical - - MHK buoyancy - * - ``B2RootFxr`` - - identical - - BeamDyn blades - * - ``B2RootFyr`` - - sign-flipped - - BeamDyn blades - * - ``B2RootFzr`` - - identical - - BeamDyn blades - * - ``B2RootMxr`` - - sign-flipped - - BeamDyn blades - * - ``B2RootMyr`` - - identical - - BeamDyn blades - * - ``B2RootMzr`` - - sign-flipped - - BeamDyn blades - * - ``B2TipRDxr`` - - sign-flipped - - BeamDyn blades - * - ``B2TipRDyr`` - - identical - - BeamDyn blades - * - ``B2TipRDzr`` - - sign-flipped - - BeamDyn blades - * - ``B2TipTDxr`` - - identical - - BeamDyn blades - * - ``B2TipTDyr`` - - sign-flipped - - BeamDyn blades - * - ``B2TipTDzr`` - - identical - - BeamDyn blades - * - ``B3AeroPwr`` - - identical - - ElastoDyn + AeroDyn - * - ``B3Azimuth`` - - identical - - ElastoDyn + AeroDyn - * - ``B3N3Clrnc`` - - identical - - Twin-rotor semisubmersible - * - ``B3RootFxr`` - - identical - - BeamDyn blades - * - ``B3RootFyr`` - - sign-flipped - - BeamDyn blades - * - ``B3RootFzr`` - - identical - - BeamDyn blades - * - ``B3RootMxr`` - - sign-flipped - - BeamDyn blades - * - ``B3RootMyr`` - - identical - - BeamDyn blades - * - ``B3RootMzr`` - - sign-flipped - - BeamDyn blades - * - ``B3TipRDxr`` - - sign-flipped - - BeamDyn blades - * - ``B3TipRDyr`` - - identical - - BeamDyn blades - * - ``B3TipRDzr`` - - sign-flipped - - BeamDyn blades - * - ``B3TipTDxr`` - - identical - - BeamDyn blades - * - ``B3TipTDyr`` - - sign-flipped - - BeamDyn blades - * - ``B3TipTDzr`` - - identical - - BeamDyn blades - * - ``BldPitch1`` - - below the noise floor - - AeroDyn nodal outputs, OLAF free wake, Twin-rotor semisubmersible - * - ``BldPitch2`` - - below the noise floor - - AeroDyn nodal outputs - * - ``BldPitch3`` - - below the noise floor - - AeroDyn nodal outputs - * - ``BlPitch1`` - - below the noise floor - - AeroDisk, yawed - * - ``BlPitch2`` - - below the noise floor - - AeroDisk, yawed - * - ``BlPitch3`` - - below the noise floor - - AeroDisk, yawed - * - ``Case`` - - identical - - AeroDyn nodal outputs, OLAF free wake - * - ``CON10PX`` - - set aside, layout-specific - - MHK buoyancy - * - ``CON10PY`` - - set aside, layout-specific - - MHK buoyancy - * - ``CON10PZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``CON11PX`` - - set aside, layout-specific - - MHK buoyancy - * - ``CON11PY`` - - set aside, layout-specific - - MHK buoyancy - * - ``CON11PZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``CON1FX`` - - set aside, layout-specific - - MHK buoyancy - * - ``CON1FY`` - - set aside, layout-specific - - MHK buoyancy - * - ``CON1FZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``CON2FX`` - - set aside, layout-specific - - MHK buoyancy - * - ``CON2FY`` - - set aside, layout-specific - - MHK buoyancy - * - ``CON2FZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``CON3FX`` - - set aside, layout-specific - - MHK buoyancy - * - ``CON3FY`` - - set aside, layout-specific - - MHK buoyancy - * - ``CON3FZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``CON4FX`` - - set aside, layout-specific - - MHK buoyancy - * - ``CON4FY`` - - set aside, layout-specific - - MHK buoyancy - * - ``CON4FZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``CON5FX`` - - set aside, layout-specific - - MHK buoyancy - * - ``CON5FY`` - - set aside, layout-specific - - MHK buoyancy - * - ``CON5FZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``CON5PX`` - - set aside, layout-specific - - MHK buoyancy - * - ``CON5PY`` - - set aside, layout-specific - - MHK buoyancy - * - ``CON5PZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``CON6FX`` - - set aside, layout-specific - - MHK buoyancy - * - ``CON6FY`` - - set aside, layout-specific - - MHK buoyancy - * - ``CON6FZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``CON6PX`` - - set aside, layout-specific - - MHK buoyancy - * - ``CON6PY`` - - set aside, layout-specific - - MHK buoyancy - * - ``CON6PZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``CON7FX`` - - set aside, layout-specific - - MHK buoyancy - * - ``CON7FY`` - - set aside, layout-specific - - MHK buoyancy - * - ``CON7FZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``CON7PX`` - - set aside, layout-specific - - MHK buoyancy - * - ``CON7PY`` - - set aside, layout-specific - - MHK buoyancy - * - ``CON7PZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``CON8FX`` - - set aside, layout-specific - - MHK buoyancy - * - ``CON8FY`` - - set aside, layout-specific - - MHK buoyancy - * - ``CON8FZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``CON8PX`` - - set aside, layout-specific - - MHK buoyancy - * - ``CON8PY`` - - set aside, layout-specific - - MHK buoyancy - * - ``CON8PZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``CON9PX`` - - set aside, layout-specific - - MHK buoyancy - * - ``CON9PY`` - - set aside, layout-specific - - MHK buoyancy - * - ``CON9PZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``FAIRTEN1`` - - set aside, layout-specific - - MHK buoyancy - * - ``FAIRTEN2`` - - set aside, layout-specific - - MHK buoyancy - * - ``FAIRTEN3`` - - set aside, layout-specific - - MHK buoyancy - * - ``FAIRTEN4`` - - set aside, layout-specific - - MHK buoyancy - * - ``GenAcc`` - - below the noise floor - - AeroDisk, yawed - * - ``GenAccel`` - - identical - - BeamDyn blades, ElastoDyn + AeroDyn - * - ``GenPwr`` - - identical - - Twin-rotor semisubmersible - * - ``GenSpeed`` - - identical - - AeroDisk, yawed, BeamDyn blades, ElastoDyn + AeroDyn, Twin-rotor semisubmersible - * - ``GenTq`` - - identical - - Twin-rotor semisubmersible - * - ``HbFbx`` - - identical - - MHK buoyancy - * - ``HbFby`` - - sign-flipped - - MHK buoyancy - * - ``HbFbz`` - - identical - - MHK buoyancy - * - ``HbMbx`` - - sign-flipped - - MHK buoyancy - * - ``HbMby`` - - identical - - MHK buoyancy - * - ``HbMbz`` - - sign-flipped - - MHK buoyancy - * - ``HSShftPwr`` - - identical - - BeamDyn blades, ElastoDyn + AeroDyn - * - ``HSShftTq`` - - identical - - BeamDyn blades, ElastoDyn + AeroDyn - * - ``HWindSpeedX`` - - identical - - AeroDyn nodal outputs, OLAF free wake - * - ``HWindSpeedY`` - - below the noise floor - - AeroDyn nodal outputs, OLAF free wake - * - ``HWindSpeedZ`` - - below the noise floor - - AeroDyn nodal outputs, OLAF free wake - * - ``HydroFxi`` - - identical - - MHK buoyancy - * - ``HydroFyi`` - - sign-flipped - - MHK buoyancy - * - ``HydroFzi`` - - identical - - MHK buoyancy - * - ``IPDefl1`` - - sign-flipped - - BeamDyn blades, ElastoDyn + AeroDyn, Twin-rotor semisubmersible - * - ``IPDefl2`` - - sign-flipped - - BeamDyn blades, ElastoDyn + AeroDyn - * - ``IPDefl3`` - - sign-flipped - - BeamDyn blades, ElastoDyn + AeroDyn - * - ``L1N10PZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``L1N11PZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``L1N12PZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``L1N13PZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``L1N14PZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``L1N15PZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``L1N16PZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``L1N17PZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``L1N18PZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``L1N19PZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``L1N1PZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``L1N20PZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``L1N21PZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``L1N22PZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``L1N23PZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``L1N24PZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``L1N25PZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``L1N26PZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``L1N27PZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``L1N28PZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``L1N29PZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``L1N2PZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``L1N30PZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``L1N31PZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``L1N32PZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``L1N33PZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``L1N34PZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``L1N35PZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``L1N36PZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``L1N37PZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``L1N38PZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``L1N39PZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``L1N3PZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``L1N40PZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``L1N4PZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``L1N5PZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``L1N6PZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``L1N7PZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``L1N8PZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``L1N9PZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``L3N10PZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``L3N11PZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``L3N12PZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``L3N13PZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``L3N14PZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``L3N15PZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``L3N16PZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``L3N17PZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``L3N18PZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``L3N19PZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``L3N1PZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``L3N20PZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``L3N21PZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``L3N22PZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``L3N23PZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``L3N24PZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``L3N25PZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``L3N26PZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``L3N27PZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``L3N28PZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``L3N29PZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``L3N2PZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``L3N30PZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``L3N31PZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``L3N32PZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``L3N33PZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``L3N34PZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``L3N35PZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``L3N36PZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``L3N37PZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``L3N38PZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``L3N39PZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``L3N3PZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``L3N40PZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``L3N4PZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``L3N5PZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``L3N6PZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``L3N7PZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``L3N8PZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``L3N9PZ`` - - set aside, layout-specific - - MHK buoyancy - * - ``LSSGagMxa`` - - sign-flipped - - BeamDyn blades, ElastoDyn + AeroDyn - * - ``LSSGagMya`` - - identical - - Twin-rotor semisubmersible - * - ``LSSGagMza`` - - sign-flipped - - Twin-rotor semisubmersible - * - ``LSShftFxa`` - - identical - - BeamDyn blades, ElastoDyn + AeroDyn - * - ``LSShftFya`` - - sign-flipped - - BeamDyn blades, ElastoDyn + AeroDyn - * - ``LSShftFza`` - - identical - - BeamDyn blades, ElastoDyn + AeroDyn - * - ``LSShftMxa`` - - sign-flipped - - BeamDyn blades, ElastoDyn + AeroDyn - * - ``LSShftTq`` - - identical - - BeamDyn blades, ElastoDyn + AeroDyn - * - ``LSSTipAxa`` - - sign-flipped - - BeamDyn blades, ElastoDyn + AeroDyn - * - ``LSSTipMya`` - - identical - - BeamDyn blades, ElastoDyn + AeroDyn - * - ``LSSTipMza`` - - sign-flipped - - BeamDyn blades, ElastoDyn + AeroDyn - * - ``LSSTipPxa`` - - mirrored angle - - BeamDyn blades, ElastoDyn + AeroDyn - * - ``LSSTipVxa`` - - sign-flipped - - BeamDyn blades, ElastoDyn + AeroDyn - * - ``NcFbx`` - - below the noise floor - - MHK buoyancy - * - ``NcFby`` - - below the noise floor - - MHK buoyancy - * - ``NcFbz`` - - below the noise floor - - MHK buoyancy - * - ``NcIMUTAxs`` - - identical - - Twin-rotor semisubmersible - * - ``NcIMUTAys`` - - sign-flipped - - Twin-rotor semisubmersible - * - ``NcIMUTAzs`` - - identical - - Twin-rotor semisubmersible - * - ``NcMbx`` - - below the noise floor - - MHK buoyancy - * - ``NcMby`` - - below the noise floor - - MHK buoyancy - * - ``NcMbz`` - - below the noise floor - - MHK buoyancy - * - ``OoPDefl1`` - - identical - - BeamDyn blades, ElastoDyn + AeroDyn, MHK buoyancy, Twin-rotor semisubmersible - * - ``OoPDefl2`` - - identical - - BeamDyn blades, ElastoDyn + AeroDyn - * - ``OoPDefl3`` - - identical - - BeamDyn blades, ElastoDyn + AeroDyn - * - ``PtfmHeave`` - - identical - - AeroDyn nodal outputs, MHK buoyancy, OLAF free wake, Twin-rotor semisubmersible - * - ``PtfmPitch`` - - identical - - AeroDyn nodal outputs, MHK buoyancy, OLAF free wake, Twin-rotor semisubmersible - * - ``PtfmRoll`` - - sign-flipped - - AeroDyn nodal outputs, MHK buoyancy, OLAF free wake, Twin-rotor semisubmersible - * - ``PtfmSurge`` - - identical - - AeroDyn nodal outputs, MHK buoyancy, OLAF free wake, Twin-rotor semisubmersible - * - ``PtfmSway`` - - sign-flipped - - AeroDyn nodal outputs, MHK buoyancy, OLAF free wake, Twin-rotor semisubmersible - * - ``PtfmYaw`` - - sign-flipped - - AeroDyn nodal outputs, MHK buoyancy, OLAF free wake, Twin-rotor semisubmersible - * - ``RootFxb1`` - - identical - - Twin-rotor semisubmersible - * - ``RootFxc1`` - - identical - - BeamDyn blades, ElastoDyn + AeroDyn, Twin-rotor semisubmersible - * - ``RootFyb1`` - - sign-flipped - - Twin-rotor semisubmersible - * - ``RootFyc1`` - - sign-flipped - - BeamDyn blades, ElastoDyn + AeroDyn, Twin-rotor semisubmersible - * - ``RootFzb1`` - - identical - - Twin-rotor semisubmersible - * - ``RootFzc1`` - - identical - - Twin-rotor semisubmersible - * - ``RootMxb1`` - - sign-flipped - - Twin-rotor semisubmersible - * - ``RootMxc1`` - - sign-flipped - - BeamDyn blades, ElastoDyn + AeroDyn, Twin-rotor semisubmersible - * - ``RootMxc2`` - - sign-flipped - - BeamDyn blades, ElastoDyn + AeroDyn - * - ``RootMxc3`` - - sign-flipped - - BeamDyn blades, ElastoDyn + AeroDyn - * - ``RootMyb1`` - - identical - - Twin-rotor semisubmersible - * - ``RootMyc1`` - - identical - - BeamDyn blades, ElastoDyn + AeroDyn, Twin-rotor semisubmersible - * - ``RootMyc2`` - - identical - - BeamDyn blades, ElastoDyn + AeroDyn - * - ``RootMyc3`` - - identical - - BeamDyn blades, ElastoDyn + AeroDyn - * - ``RootMzb1`` - - sign-flipped - - Twin-rotor semisubmersible - * - ``RootMzc1`` - - sign-flipped - - BeamDyn blades, ElastoDyn + AeroDyn, Twin-rotor semisubmersible - * - ``RotAcc`` - - below the noise floor - - AeroDisk, yawed - * - ``RotAccel`` - - identical - - BeamDyn blades, ElastoDyn + AeroDyn - * - ``RotPwr`` - - identical - - AeroDisk, yawed, BeamDyn blades, ElastoDyn + AeroDyn - * - ``RotSpeed`` - - identical - - AeroDisk, yawed, AeroDyn nodal outputs, BeamDyn blades, ElastoDyn + AeroDyn, OLAF free wake, Twin-rotor semisubmersible - * - ``RotThrust`` - - identical - - BeamDyn blades, ElastoDyn + AeroDyn - * - ``RotTorq`` - - identical - - AeroDisk, yawed, BeamDyn blades, ElastoDyn + AeroDyn, Twin-rotor semisubmersible - * - ``RtAeroCp`` - - identical - - AeroDyn nodal outputs, ElastoDyn + AeroDyn - * - ``RtAeroCq`` - - sign-flipped - - AeroDyn nodal outputs, ElastoDyn + AeroDyn - * - ``RtAeroCt`` - - identical - - AeroDyn nodal outputs, ElastoDyn + AeroDyn - * - ``RtAeroFxh`` - - identical - - AeroDyn nodal outputs, BeamDyn blades, ElastoDyn + AeroDyn, Twin-rotor semisubmersible - * - ``RtAeroFyh`` - - sign-flipped - - AeroDyn nodal outputs, ElastoDyn + AeroDyn, Twin-rotor semisubmersible - * - ``RtAeroFzh`` - - identical - - AeroDyn nodal outputs, ElastoDyn + AeroDyn, Twin-rotor semisubmersible - * - ``RtAeroMxh`` - - sign-flipped - - BeamDyn blades, ElastoDyn + AeroDyn, Twin-rotor semisubmersible - * - ``RtAeroMyh`` - - identical - - AeroDyn nodal outputs, ElastoDyn + AeroDyn, Twin-rotor semisubmersible - * - ``RtAeroMzh`` - - sign-flipped - - ElastoDyn + AeroDyn, Twin-rotor semisubmersible - * - ``RtAeroPwr`` - - identical - - AeroDyn nodal outputs, BeamDyn blades, ElastoDyn + AeroDyn - * - ``RtArea`` - - identical - - AeroDyn nodal outputs, Twin-rotor semisubmersible - * - ``RtFldFxh`` - - identical - - MHK buoyancy - * - ``RtFldFyh`` - - sign-flipped - - MHK buoyancy - * - ``RtFldFzg`` - - identical - - MHK buoyancy - * - ``RtFldMxh`` - - sign-flipped - - MHK buoyancy - * - ``RtFldMyg`` - - identical - - MHK buoyancy - * - ``RtFldMzh`` - - sign-flipped - - MHK buoyancy - * - ``RtSkew`` - - identical - - AeroDyn nodal outputs, BeamDyn blades, ElastoDyn + AeroDyn - * - ``RtSpeed`` - - identical - - AeroDyn nodal outputs, ElastoDyn + AeroDyn - * - ``RtTSR`` - - identical - - AeroDyn nodal outputs, BeamDyn blades, ElastoDyn + AeroDyn - * - ``RtVAvgxh`` - - identical - - AeroDyn nodal outputs, Twin-rotor semisubmersible - * - ``RtVAvgyh`` - - sign-flipped - - AeroDyn nodal outputs - * - ``RtVAvgzh`` - - identical - - AeroDyn nodal outputs - * - ``ShearExp`` - - identical - - AeroDyn nodal outputs, OLAF free wake - * - ``Time`` - - identical - - AeroDisk, yawed, AeroDyn nodal outputs, BeamDyn blades, ElastoDyn + AeroDyn, MHK buoyancy, OLAF free wake - * - ``TipDxc1`` - - identical - - BeamDyn blades, ElastoDyn + AeroDyn - * - ``TipDyc1`` - - sign-flipped - - BeamDyn blades, ElastoDyn + AeroDyn - * - ``TTDspFA`` - - identical - - Twin-rotor semisubmersible - * - ``TTDspSS`` - - sign-flipped - - Twin-rotor semisubmersible - * - ``TTDspTwst`` - - below the noise floor - - Twin-rotor semisubmersible - * - ``TwN1Fbx`` - - below the noise floor - - MHK buoyancy - * - ``TwN1Mbx`` - - below the noise floor - - MHK buoyancy - * - ``TwN2Mby`` - - below the noise floor - - MHK buoyancy - * - ``TwN3Fby`` - - below the noise floor - - MHK buoyancy - * - ``TwN3Mbz`` - - below the noise floor - - MHK buoyancy - * - ``TwN4Fbz`` - - below the noise floor - - MHK buoyancy - * - ``TwrBsFxt`` - - identical - - BeamDyn blades, ElastoDyn + AeroDyn, Twin-rotor semisubmersible - * - ``TwrBsFyt`` - - sign-flipped - - BeamDyn blades, ElastoDyn + AeroDyn, Twin-rotor semisubmersible - * - ``TwrBsFzt`` - - identical - - Twin-rotor semisubmersible - * - ``TwrBsMxt`` - - sign-flipped - - BeamDyn blades, ElastoDyn + AeroDyn, Twin-rotor semisubmersible - * - ``TwrBsMyt`` - - identical - - BeamDyn blades, ElastoDyn + AeroDyn, Twin-rotor semisubmersible - * - ``TwrBsMzt`` - - sign-flipped - - BeamDyn blades, ElastoDyn + AeroDyn, Twin-rotor semisubmersible - * - ``TwrTpTDxi`` - - identical - - MHK buoyancy - * - ``TwrTpTDyi`` - - sign-flipped - - MHK buoyancy - * - ``TwrTpTDzi`` - - identical - - MHK buoyancy - * - ``TwstDefl1`` - - below the noise floor - - Twin-rotor semisubmersible - * - ``Wave1Elev`` - - identical - - MHK buoyancy - * - ``Wind1VelX`` - - identical - - AeroDisk, yawed, AeroDyn nodal outputs, BeamDyn blades, ElastoDyn + AeroDyn - * - ``Wind1VelY`` - - below the noise floor - - AeroDisk, yawed, AeroDyn nodal outputs, BeamDyn blades, ElastoDyn + AeroDyn - * - ``Wind1VelZ`` - - below the noise floor - - AeroDisk, yawed, AeroDyn nodal outputs, BeamDyn blades, ElastoDyn + AeroDyn - * - ``Yaw`` - - sign-flipped - - AeroDisk, yawed, AeroDyn nodal outputs, OLAF free wake - * - ``YawBrFxp`` - - identical - - BeamDyn blades, ElastoDyn + AeroDyn, Twin-rotor semisubmersible - * - ``YawBrFyp`` - - sign-flipped - - BeamDyn blades, ElastoDyn + AeroDyn, Twin-rotor semisubmersible - * - ``YawBrFzp`` - - identical - - BeamDyn blades, ElastoDyn + AeroDyn, Twin-rotor semisubmersible - * - ``YawBrMxp`` - - sign-flipped - - BeamDyn blades, ElastoDyn + AeroDyn, Twin-rotor semisubmersible - * - ``YawBrMyp`` - - identical - - BeamDyn blades, ElastoDyn + AeroDyn, Twin-rotor semisubmersible - * - ``YawBrMzp`` - - sign-flipped - - BeamDyn blades, ElastoDyn + AeroDyn, Twin-rotor semisubmersible - * - ``YawRate`` - - below the noise floor - - AeroDisk, yawed diff --git a/reg_tests/otherTests/README.md b/reg_tests/otherTests/README.md index 2d99185ca1..ca3ed274ee 100644 --- a/reg_tests/otherTests/README.md +++ b/reg_tests/otherTests/README.md @@ -23,7 +23,7 @@ expressed in different frames. | Script | What it does | |---|---| | `compare_mirror.py` | the shared classifier. `classify(x, y, tol, floor)` returns `S`, `F`, `A`, `negligible` or `?`. Blade spacing follows the rotation sense, so blade k pairs with blade k directly and no permutation is needed; the mooring `--swap` mapping (layout pairings) remains where a script needs it. Everything else imports this | -| `emit_sign_table.py` | regenerates the measured sign table in `mirror_rotor.rst` by running every registered mirrored pair and classifying every channel | +| `emit_sign_table.py` | measures the sign map by running every registered mirrored pair and classifying every channel; `--emit-map` regenerates `docs/source/user/glue-code/mirror_rotor_sign_map.yaml` (the rendered per-channel page was retired 2026-09-30 — the grouped summary in `mirror_rotor.rst` is maintained by hand) | | `check_rtest_mirror_pair.py` | checks the registered clockwise/mirrored pairs, with per-pair tolerance and start time | | `openfast_case_mirror.py` | clones a regression case verbatim and toggles only `MirrorRotor` | | `mr_two_rotor.py` | compares rotor 1 against rotor 2 inside one multi-rotor glue-code run | diff --git a/reg_tests/otherTests/emit_sign_table.py b/reg_tests/otherTests/emit_sign_table.py index bdced07a45..08d28dfef4 100644 --- a/reg_tests/otherTests/emit_sign_table.py +++ b/reg_tests/otherTests/emit_sign_table.py @@ -87,11 +87,12 @@ def measure(a, na, b, nb, tol, floor): def emit_map(groups, mooring, origin, conflicts, tol, floor): """Write the per-channel sign map into docs/source. - Two artefacts from one measurement: a YAML file for anything that wants to - consume the map, and a reStructuredText page that renders it for a reader. - Both are generated -- neither should be hand-edited, because the map is - measured on every run and a hand edit would be silently overwritten or, - worse, silently disagree with what the code actually does. + One artefact from one measurement: a YAML file for anything that wants to + consume the map as data. It is generated -- never hand-edited, because the + map is measured on every run and a hand edit would be silently overwritten + or, worse, silently disagree with what the code actually does. The rendered + per-channel page was retired on 2026-09-30; a grouped summary lives in + mirror_rotor.rst and the full listing travels with the pull request text. """ docs = os.path.join(REPO_ROOT, "docs", "source", "user", "glue-code") labels = {k: lbl for k, lbl, _ in BEHAVIOUR} @@ -129,70 +130,7 @@ def emit_map(groups, mooring, origin, conflicts, tol, floor): for n, k, lbl, src in rows: fh.write(f' {n}: {{behaviour: {k}, measured_in: [{", ".join(src)}]}}\n') - rst = os.path.join(docs, "mirror_rotor_sign_map.rst") - with open(rst, "w") as fh: - fh.write(""".. _glue-code-mirror-rotor-sign-map: - -Mirror-rotor sign map -===================== - -.. warning:: - This page is **generated**. Do not edit it by hand; regenerate it with - - .. code-block:: bash - - python3 reg_tests/otherTests/emit_sign_table.py --tol """ + str(tol) + """ --emit-map - -Every entry below is **measured**, not asserted. Each registered -clockwise/mirrored pair is run and every output channel is compared against its -counterpart, so this records behaviour that is observed rather than behaviour -expected from reading the source. A channel seen in more than one pair must -agree across them; a disagreement is reported rather than silently resolved. - -The grouped, prose form of the same information is in -:ref:`glue-code-mirror-rotor-verification`, which is the better place to start. -This page exists for looking a single channel up, and for anything that wants to -consume the map as data -- see ``mirror_rotor_sign_map.yaml`` beside this file. - -**Read it correctly.** This records how the two runs of a *symmetric* comparison -relate to each other, which is how the implementation is verified. It is **not** -a claim that these channels change sign whenever the flag is set: in an ordinary -simulation the tower, support structure and inflow are not mirrored, so a -quantity such as ``TwrBsMxt`` is simply the response of an unchanged structure to -a counter-clockwise rotor. - -Blade spacing follows the rotation direction, so a mirrored blade is compared -against the clockwise blade of the same number. Mooring channels are set -aside because which line pairs with which depends on the layout. - -""") - fh.write(f"Measured at a relative tolerance of ``{tol}`` with a noise floor of " - f"``{floor}``, across {len(rows)} channels.\n\n") - for k, lbl, meaning in BEHAVIOUR: - n = len(groups.get(k, [])) - if n: - fh.write(f"* **{lbl}** ({n}) -- {meaning}\n") - fh.write(f"* **set aside** ({len(mooring)}) -- mooring, pairing is " - "layout-specific\n\n") - if conflicts: - fh.write(".. warning::\n Channels observed behaving differently in " - "different pairs:\n\n") - for n, cl, src in conflicts: - fh.write(f" * ``{n}``: {cl}, seen in {src}\n") - fh.write("\n") - fh.write(""".. list-table:: - :header-rows: 1 - :widths: 30 25 45 - - * - Channel - - Behaviour - - Measured in -""") - for n, k, lbl, src in rows: - fh.write(f" * - ``{n}``\n - {lbl}\n - {', '.join(src)}\n") - print(f"\nwrote {yml}") - print(f"wrote {rst}") print(f" {len(rows)} channels") From 25fc0e48a9eeedda81e5383ba5ac44d1b89d2c97 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Wed, 30 Sep 2026 14:46:59 -0600 Subject: [PATCH 66/66] Document the remaining guard checks and render the flow chart properly Three additions close the gaps between the pull-request discussion and the documentation. The Controllers section now records that assumptions of even blade spacing in the direction of rotation hold for a mirrored rotor -- ServoDyn's cosine flap schedule and the per-blade offsets a Bladed-style DLL computes for itself -- because the blades are numbered that way. The Verification section names the tooling that guards the conventions: check_rtest_mirror_pair.py with its sweep-order assertion on the BAzimuth channels, which discriminates the blade numbering by a full blade spacing, and run_guards.sh, which proves every refusal fires when its combination is requested and stays silent for a clockwise rotor, FAST.Farm included. The FAST.Farm input documentation states both refusals a turbine model can meet under it: more than one rotor per OpenFAST instance, and a mirrored rotor. The flow chart on the mirror page needed the renderer sorted out. The bundled mermaid that ships with older sphinxcontrib-mermaid dropped most multi-line labels, so the requirement moves to sphinxcontrib-mermaid >= 2.1, where they render. The diagram runs left to right, since thirteen detail boxes stack far better against a wide page than a tall one, and an init line sets the spacing and a theme of black text on light blue boxes. Mermaid only ever scales a diagram down, never up, so custom.css sizes the rendered SVG to seventy percent of the content column and centres it; the selector matches on the class alone because sphinxcontrib-mermaid 2.x emits a pre element where older versions emitted a div. Assisted-by: Claude Fable 5 --- docs/_static/custom.css | 12 +++++++++++ docs/requirements.txt | 2 +- docs/source/user/fast.farm/InputFiles.rst | 7 +++++++ docs/source/user/glue-code/mirror_rotor.rst | 23 ++++++++++++++++++++- 4 files changed, 42 insertions(+), 2 deletions(-) diff --git a/docs/_static/custom.css b/docs/_static/custom.css index 9952b9d274..33dff05dde 100644 --- a/docs/_static/custom.css +++ b/docs/_static/custom.css @@ -26,3 +26,15 @@ table.wrap-last td:last-child { } + +/* Mermaid diagrams: fill the content column rather than rendering at + natural size (mermaid only scales down, never up). sphinxcontrib-mermaid + 2.x emits
, older versions 
, + so match the class alone. */ +.mermaid svg { + width: 70% !important; + max-width: 70% !important; + height: auto !important; + display: block; + margin: 0 auto; +} diff --git a/docs/requirements.txt b/docs/requirements.txt index 0754df7926..21bc3ed2ee 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -5,7 +5,7 @@ pyparsing>=2.1 Sphinx>=1.8.5 sphinxcontrib-bibtex>=2.0.0 sphinxcontrib-doxylink>=1.3 -sphinxcontrib-mermaid>=0.6 +sphinxcontrib-mermaid>=2.1 sphinx_rtd_theme>=0.3 requests[security] urllib3<2.0.0 diff --git a/docs/source/user/fast.farm/InputFiles.rst b/docs/source/user/fast.farm/InputFiles.rst index bcc524f4e7..f8a48191be 100644 --- a/docs/source/user/fast.farm/InputFiles.rst +++ b/docs/source/user/fast.farm/InputFiles.rst @@ -390,6 +390,13 @@ For each wind turbine: :numref:`FF:Input:OFInput` for information on the contents of the OpenFAST input files. + Two OpenFAST features are refused under FAST.Farm at initialization, + with a fatal error, rather than run unverified: an OpenFAST model with + more than one rotor (**NRotors** > 1 — only one rotor per OpenFAST + instance is supported with FAST.Farm), and a mirrored rotor + (**MirrorRotor** = True — the wake coupling has not yet been verified + for a counter-clockwise rotor; see :numref:`glue-code-mirror-rotor`). + - When **Mod_AmbWind** = 2 or 3, the Wind Turbines table has six additional columns to complete the spatial discretization of the high-resolution wind domain for each wind turbine: diff --git a/docs/source/user/glue-code/mirror_rotor.rst b/docs/source/user/glue-code/mirror_rotor.rst index a123d8249d..e3571fb5ff 100644 --- a/docs/source/user/glue-code/mirror_rotor.rst +++ b/docs/source/user/glue-code/mirror_rotor.rst @@ -74,7 +74,8 @@ The flow of the flag through the code, and what changes where: .. mermaid:: - flowchart TD + %%{init: {"theme": "base", "flowchart": {"rankSpacing": 110, "nodeSpacing": 45}, "themeVariables": {"fontSize": "18px", "primaryColor": "#d8e9f7", "primaryTextColor": "#000000", "primaryBorderColor": "#5b8db8", "lineColor": "#5b8db8"}}}%% + flowchart LR FST["OpenFAST primary input
MirrorRotor = T (per rotor)"] --> GLUE["Glue code
hands the flag to each module at Init"] GLUE --> ED["ElastoDyn /
Simplified-ElastoDyn"] @@ -443,6 +444,12 @@ would see on a clockwise machine and behaves identically. Rotor speed, blade pitch, generator and brake torque, shaft azimuth and the blade root moments are all converted; the controller needs no mirrored copy and no new input. +Assumptions of even blade spacing *in the direction of rotation* also hold, +because the blades are numbered that way for either convention: ServoDyn's +built-in cosine flap schedule and the per-blade azimuth offsets a Bladed-style +DLL computes for itself from the rotor azimuth are correct for a mirrored rotor +with no controller-side change. + Yaw is the exception, and it is deliberate. Yaw acts about the vertical axis in the inertial frame, so it is **not** a rotor-convention quantity and is left alone. The yaw angle, the wind direction and hence the yaw error all stay @@ -595,3 +602,17 @@ turbulence box, for the reason given above. For a clockwise rotor every mirror-related expression reduces to a multiplication by ``+1``, so existing regression baselines reproduce bit-for-bit. + +Two further checks live in ``reg_tests/otherTests/``. +``check_rtest_mirror_pair.py`` compares the committed baselines of every pair +against each other and carries a **sweep-order assertion** on the ``BAzimuth`` +channels: the blade spacing from blade 1 must read +120° and +240° in the +rotor's own convention for the clockwise *and* the mirrored half, which guards +the blade-numbering convention directly — under the reversed numbering the +mirrored half reads 240° and 120°, a full blade spacing of discrimination. +``run_guards.sh`` proves every restriction in the table above actually +**fires** when its combination is requested, and stays silent for a clockwise +rotor — including the FAST.Farm refusals, which it exercises against the real +FAST.Farm executable — alongside the visualisation-surface comparison. A guard +that is never reached looks exactly like a guard that stayed silent, which is +why the firing is tested rather than assumed.

sYkLyzmIuF1K9CIq{D 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%0AbD* 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�) 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