From 2e1d8e02da6470fb630c49f4bd105011418c9d3f Mon Sep 17 00:00:00 2001 From: Lu Wang Date: Thu, 12 Dec 2024 14:04:58 -0700 Subject: [PATCH 01/10] ED: Expand yaw-friction modeling to include quadratic viscous friction and additional Coulomb-friction terms proportional to yaw-bearing shear force and bending moment --- modules/elastodyn/src/ElastoDyn.f90 | 69 ++++++++++++-------- modules/elastodyn/src/ElastoDyn_IO.f90 | 50 +++++++++++++- modules/elastodyn/src/ElastoDyn_Registry.txt | 17 ++++- 3 files changed, 101 insertions(+), 35 deletions(-) diff --git a/modules/elastodyn/src/ElastoDyn.f90 b/modules/elastodyn/src/ElastoDyn.f90 index 297db8684..ad40583f6 100644 --- a/modules/elastodyn/src/ElastoDyn.f90 +++ b/modules/elastodyn/src/ElastoDyn.f90 @@ -1247,11 +1247,12 @@ SUBROUTINE ED_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg ) m%AllOuts( YawBrMxp) = DOT_PRODUCT( MomBNcRt, m%CoordSys%b1 ) m%AllOuts( YawBrMyp) = -DOT_PRODUCT( MomBNcRt, m%CoordSys%b3 ) m%AllOuts(YawFriMom) = OtherState%Mfhat*0.001_ReKi !KBF add YawFricMom as an output based on HSSBrTq (kN-m) - m%AllOuts(YawFriMfp) = OtherState%YawFriMfp*0.001_ReKi - m%AllOuts(YawFriMz) = m%YawFriMz*0.001_ReKi - m%FrcONcRt = m%AllOuts( YawBrFzn)*1000_ReKi - m%AllOuts(OmegaYF) = OtherState%OmegaTn*R2D - m%AllOuts(dOmegaYF) = OtherState%OmegaDotTn*R2D + m%AllOuts(YawFriMfp) = OtherState%YawFriMfp*0.001_ReKi + m%AllOuts(YawFriMz) = m%YawFriMz*0.001_ReKi + m%FrcONcRt = (/m%AllOuts( YawBrFxn),m%AllOuts( YawBrFyn),m%AllOuts( YawBrFzn)/) * 1000_ReKi + m%MomONcRt = (/m%AllOuts( YawBrMxn),m%AllOuts( YawBrMyn),m%AllOuts( YawBrMzn)/) * 1000_ReKi + m%AllOuts(OmegaYF) = OtherState%OmegaTn*R2D + m%AllOuts(dOmegaYF) = OtherState%OmegaDotTn*R2D ! Tower Base Loads: @@ -1874,8 +1875,7 @@ SUBROUTINE ED_CalcContStateDeriv( t, u, p, x, xd, z, OtherState, m, dxdt, ErrSta INTEGER(IntKi) :: ErrStat2 ! The error status code CHARACTER(ErrMsgLen) :: ErrMsg2 ! The error message, if an error occurred CHARACTER(*), PARAMETER :: RoutineName = 'ED_CalcContStateDeriv' - Real(R8Ki) :: YawFriMz ! Loops through some or all of the DOFs. - Real(R8Ki) :: Fz ! Loops through some or all of the DOFs. + Real(R8Ki) :: YawFriMz ! External loading on yaw bearing not including inertial contributions ! Initialize ErrStat @@ -1917,11 +1917,10 @@ SUBROUTINE ED_CalcContStateDeriv( t, u, p, x, xd, z, OtherState, m, dxdt, ErrSta CALL RFurling( t, p, x%QT(DOF_RFrl), x%QDT(DOF_RFrl), m%RtHS%RFrlMom ) ! Compute moment from rotor-furl springs and dampers, RFrlMom CALL TFurling( t, p, x%QT(DOF_TFrl), x%QDT(DOF_TFrl), m%RtHS%TFrlMom ) ! Compute moment from tail-furl springs and dampers, TFrlMom ! Compute the yaw friction torque - Fz= m%FrcONcRt !YawBrFzn force from CalcOutput YawFriMz=DOT_PRODUCT( m%RtHS%MomBNcRtt, m%CoordSys%d2 ) + u%YawMom m%YawFriMz = YawFriMz - CALL YawFriction( t, p, Fz, YawFriMz, OtherState%OmegaTn, OtherState%OmegaDotTn, m%RtHS%YawFriMom ) !Compute yaw Friction #RRD + CALL YawFriction( t, p, m%FrcONcRt, m%MomONcRt, YawFriMz, OtherState%OmegaTn, OtherState%OmegaDotTn, m%RtHS%YawFriMom ) !Compute yaw Friction #RRD !bjj: note m%RtHS%GBoxEffFac needed in OtherState only to fix HSSBrTrq (and used in FillAugMat) @@ -3334,10 +3333,16 @@ SUBROUTINE SetPrimaryParameters( InitInp, p, InputFileData, ErrStat, ErrMsg ) p%TeetHSSp = 0.0 END IF + ! Yaw friction model inputs p%YawFrctMod = InputFileData%YawFrctMod - p%M_CD = InputFileData%M_CD - p%M_CSmax = InputFileData%M_CSmax - p%sig_v = InputFileData%sig_v + p%M_CD = InputFileData%M_CD + p%M_FCD = InputFileData%M_FCD + p%M_MCD = InputFileData%M_MCD + p%M_CSmax = InputFileData%M_CSmax + p%M_FCSmax = InputFileData%M_FCSmax + p%M_MCSmax = InputFileData%M_MCSmax + p%sig_v = InputFileData%sig_v + p%sig_v2 = InputFileData%sig_v2 CALL AllocAry( p%TipMass, p%NumBl, 'TipMass', ErrStat, ErrMsg ) @@ -6403,24 +6408,24 @@ SUBROUTINE Teeter( t, p, TeetDef, TeetRate, TeetMom ) END SUBROUTINE Teeter !---------------------------------------------------------------------------------------------------------------------------------- !> This routine computes the Yaw Friction Torque due to yaw rate and acceleration. -SUBROUTINE YawFriction( t, p, Fz, Mzz, Omg, OmgDot, YawFriMf ) +SUBROUTINE YawFriction( t, p, F, M, Mzz, Omg, OmgDot, YawFriMf ) !.................................................................................................................................. ! Passed Variables: REAL(DbKi), INTENT(IN) :: t !< simulation time TYPE(ED_ParameterType), INTENT(IN) :: p !< parameters from the structural dynamics module - REAL(R8Ki), INTENT(IN ) :: Fz, Mzz !< Effective yaw bearing force and external yaw bearing torque - REAL(R8Ki), INTENT(IN ) :: Omg !< The yaw rate (rotational speed), x%QDT(DOF_Yaw). - REAL(R8Ki), INTENT(IN ) :: OmgDot !< The yaw acceleration (derivative of rotational speed), x%QD2T(DOF_Yaw). - - REAL(ReKi), INTENT(OUT) :: YawFriMf !< The total friction torque (Coulomb + viscous). + REAL(R8Ki), INTENT(IN ) :: F(3), M(3) !< Effective yaw bearing force and moment + REAL(R8Ki), INTENT(IN ) :: Mzz !< External yaw bearing torque + REAL(R8Ki), INTENT(IN ) :: Omg !< The yaw rate (rotational speed), x%QDT(DOF_Yaw). + REAL(R8Ki), INTENT(IN ) :: OmgDot !< The yaw acceleration (derivative of rotational speed), x%QD2T(DOF_Yaw). + REAL(ReKi), INTENT(OUT) :: YawFriMf !< The total friction torque (Coulomb + viscous). ! Local variables: - REAL(ReKi) :: temp ! It takes teh value of Fz or -1. + REAL(ReKi) :: temp, Fs, Mb ! It takes the value of Fz or -1. SELECT CASE ( p%YawFrctMod ) - ! Yaw-friction model {0: none, 1: does not use Fz at yaw bearing, 2: does, 3: user defined model} (switch) + ! Yaw-friction model {0: none, 1: does not use F and M at yaw bearing, 2: does, 3: user defined model} (switch) CASE ( 0_IntKi ) ! None! @@ -6428,28 +6433,34 @@ SUBROUTINE YawFriction( t, p, Fz, Mzz, Omg, OmgDot, YawFriMf ) YawFriMf = 0.0_ReKi - CASE ( 1_IntKi, 2_IntKi ) ! 1= no Fz use. 2=Fz used + CASE ( 1_IntKi, 2_IntKi ) ! 1 = F and M not used. 2 = F and M used + + temp = -1.0_ReKi ! In the case of YawFrctMod=1 + Fs = 0.0_ReKi + Mb = 0.0_ReKi - temp = -1.0_ReKi !In the case of YawFrctMod=1 - IF (p%YawFrctMod .EQ. 2) THEN - temp = MIN(0.0_R8Ki, Fz) !In the case of YawFrctMod=2 + temp = MIN(0.0_R8Ki, F(3)) ! In the case of YawFrctMod=2 + Fs = SQRT(F(1)**2+F(2)**2) ! Effective shear force on yaw bearing + Mb = SQRT(M(1)**2+M(2)**2) ! Effective bending moment on yaw bearing ENDIF IF (EqualRealNos( Omg, 0.0_R8Ki ) )THEN - YawFriMf = -MIN(real(p%M_CD,ReKi) * ABS(temp), ABS(real(Mzz,ReKi))) * SIGN(1.0_ReKi, real(Mzz,ReKi)) IF (EqualRealNos( OmgDot, 0.0_R8Ki )) THEN - YawFriMf = -MIN(real(p%M_CSmax,ReKi) * ABS(temp), ABS(real(Mzz,ReKi))) * SIGN(1.0_ReKi, real(Mzz,ReKi)) + YawFriMf = -MIN( real(p%M_CSmax,ReKi) * ABS(temp) + real(p%M_FCSmax,ReKi) * Fs + real(p%M_MCSmax,ReKi) * Mb, ABS(real(Mzz,ReKi)) ) * SIGN(1.0_ReKi, real(Mzz,ReKi)) + ELSE + YawFriMf = -MIN( real(p%M_CD, ReKi) * ABS(temp) + real(p%M_FCD, ReKi) * Fs + real(p%M_MCD, ReKi) * Mb, ABS(real(Mzz,ReKi)) ) * SIGN(1.0_ReKi, real(Mzz,ReKi)) ENDIF ELSE - YawFriMf = real(p%M_CD,ReKi) * temp * sign(1.0_ReKi, real(Omg,ReKi)) - real(p%sig_v,ReKi) * real(Omg,ReKi) + YawFriMf = ( real(p%M_CD,ReKi) * temp - real(p%M_FCD,ReKi) * Fs - real(p%M_MCD,ReKi) * Mb ) * sign(1.0_ReKi, real(Omg,ReKi)) & ! Coulomb friction + - real(p%sig_v,ReKi) * real(Omg,ReKi) - real(p%sig_v2,ReKi) * real(Omg,ReKi) * ABS(real(Omg,ReKi)) ! Viscous friction ENDIF - CASE ( 3_IntKi ) ! User-defined YawFriMf model. >>>> NOT IMPLEMENTED YET + CASE ( 3_IntKi ) ! User-defined YawFriMf model. >>>> NOT IMPLEMENTED YET - CALL UserYawFrict ( t, Fz, Mzz, Omg, OmgDot, p%RootName, YawFriMf ) + CALL UserYawFrict ( t, F, M, Mzz, Omg, OmgDot, p%RootName, YawFriMf ) END SELECT diff --git a/modules/elastodyn/src/ElastoDyn_IO.f90 b/modules/elastodyn/src/ElastoDyn_IO.f90 index 23054a48c..e892c00ef 100644 --- a/modules/elastodyn/src/ElastoDyn_IO.f90 +++ b/modules/elastodyn/src/ElastoDyn_IO.f90 @@ -3259,7 +3259,7 @@ SUBROUTINE ReadPrimaryFile( InputFile, InputFileData, BldFile, FurlFile, TwrFile RETURN END IF - !---------------------- YAW-FRICTION -------------------------------------------- + !---------------------- YAW-FRICTION -------------------------------------------- CALL ReadCom( UnIn, InputFile, 'Section Header: Yaw-Friction', ErrStat2, ErrMsg2, UnEc ) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) IF ( ErrStat >= AbortErrLev ) THEN @@ -3283,6 +3283,22 @@ SUBROUTINE ReadPrimaryFile( InputFile, InputFileData, BldFile, FurlFile, TwrFile RETURN END IF + ! M_FCSmax - Maximum Coulomb friction torque proportional to yaw bearing shear force (N-m): + CALL ReadVar( UnIn, InputFile, InputFileData%M_FCSmax, "M_FCSmax", "Maximum Coulomb friction torque proportional to yaw bearing shear force (N-m)", ErrStat2, ErrMsg2, UnEc) + CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + IF ( ErrStat >= AbortErrLev ) THEN + CALL Cleanup() + RETURN + END IF + + ! M_MCSmax - Maximum Coulomb friction torque proportional to yaw bearing bending moment (N-m): + CALL ReadVar( UnIn, InputFile, InputFileData%M_MCSmax, "M_MCSmax", "Maximum Coulomb friction torque proportional to yaw bearing bending moment (N-m)", ErrStat2, ErrMsg2, UnEc) + CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + IF ( ErrStat >= AbortErrLev ) THEN + CALL Cleanup() + RETURN + END IF + ! M_CD - Dynamic friction moment at null yaw rate (N-m): CALL ReadVar( UnIn, InputFile, InputFileData%M_CD, "M_CD", "Dynamic friction moment at null yaw rate (N-m)", ErrStat2, ErrMsg2, UnEc) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) @@ -3291,14 +3307,37 @@ SUBROUTINE ReadPrimaryFile( InputFile, InputFileData, BldFile, FurlFile, TwrFile RETURN END IF - ! sig_v - Viscous friction coefficiant (N-m s/rad): - CALL ReadVar( UnIn, InputFile, InputFileData%sig_v, "sig_v", "Viscous friction coefficient (N-m/(rad/s))", ErrStat2, ErrMsg2, UnEc) + ! M_FCD - Dynamic friction moment at null yaw rate proportional to yaw bearing shear force (N-m): + CALL ReadVar( UnIn, InputFile, InputFileData%M_FCD, "M_FCD", "Dynamic friction moment at null yaw rate proportional to yaw bearing shear force (N-m)", ErrStat2, ErrMsg2, UnEc) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) IF ( ErrStat >= AbortErrLev ) THEN CALL Cleanup() RETURN END IF + ! M_MCD - Dynamic friction moment at null yaw rate proportional to yaw bearing bending moment (N-m): + CALL ReadVar( UnIn, InputFile, InputFileData%M_MCD, "M_MCD", "Dynamic friction moment at null yaw rate proportional to yaw bearing bending moment (N-m)", ErrStat2, ErrMsg2, UnEc) + CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + IF ( ErrStat >= AbortErrLev ) THEN + CALL Cleanup() + RETURN + END IF + + ! sig_v - Linear viscous friction coefficiant (N-m s/rad): + CALL ReadVar( UnIn, InputFile, InputFileData%sig_v, "sig_v", "Linear viscous friction coefficient (N-m/(rad/s))", ErrStat2, ErrMsg2, UnEc) + CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + IF ( ErrStat >= AbortErrLev ) THEN + CALL Cleanup() + RETURN + END IF + + ! sig_v2 - Quadratic viscous friction coefficiant (N-m (s/rad)^2): + CALL ReadVar( UnIn, InputFile, InputFileData%sig_v2, "sig_v2", "Quadratic viscous friction coefficient (N-m/(rad/s)^2)", ErrStat2, ErrMsg2, UnEc) + CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + IF ( ErrStat >= AbortErrLev ) THEN + CALL Cleanup() + RETURN + END IF !---------------------- DRIVETRAIN ---------------------------------------------- CALL ReadCom( UnIn, InputFile, 'Section Header: Drivetrain', ErrStat2, ErrMsg2, UnEc ) @@ -4332,8 +4371,13 @@ SUBROUTINE ValidatePrimaryData( InputFileData, BD4Blades, Linearize, MHK, ErrSta ( InputFileData%YawFrctMod /= 2_IntKi ) .AND. ( InputFileData%YawFrctMod /= 3_IntKi )) & CALL SetErrStat( ErrID_Fatal, 'YawFrctMod must be 0, 1, 2, or 3',ErrStat,ErrMsg,RoutineName) IF ( InputFileData%M_CD < 0_R8Ki ) CALL SetErrStat( ErrID_Fatal, 'M_CD must be greater than or equal to 0.',ErrStat,ErrMsg,RoutineName ) + IF ( InputFileData%M_FCD < 0_R8Ki ) CALL SetErrStat( ErrID_Fatal, 'M_FCD must be greater than or equal to 0.',ErrStat,ErrMsg,RoutineName ) + IF ( InputFileData%M_MCD < 0_R8Ki ) CALL SetErrStat( ErrID_Fatal, 'M_MCD must be greater than or equal to 0.',ErrStat,ErrMsg,RoutineName ) IF ( InputFileData%M_CSmax < 0_R8Ki ) CALL SetErrStat( ErrID_Fatal, 'M_CSmax must be greater than or equal to 0.',ErrStat,ErrMsg,RoutineName ) + IF ( InputFileData%M_FCSmax < 0_R8Ki ) CALL SetErrStat( ErrID_Fatal, 'M_FCSmax must be greater than or equal to 0.',ErrStat,ErrMsg,RoutineName ) + IF ( InputFileData%M_MCSmax < 0_R8Ki ) CALL SetErrStat( ErrID_Fatal, 'M_MCSmax must be greater than or equal to 0.',ErrStat,ErrMsg,RoutineName ) IF ( InputFileData%sig_v < 0_R8Ki ) CALL SetErrStat( ErrID_Fatal, 'sig_v must be greater than or equal to 0.',ErrStat,ErrMsg,RoutineName ) + IF ( InputFileData%sig_v2 < 0_R8Ki ) CALL SetErrStat( ErrID_Fatal, 'sig_v2 must be greater than or equal to 0.',ErrStat,ErrMsg,RoutineName ) !bjj: since ED doesn't actually use OutFmt at this point, I'm going to remove this check and warning message !!!! ! Check that InputFileData%OutFmt is a valid format specifier and will fit over the column headings diff --git a/modules/elastodyn/src/ElastoDyn_Registry.txt b/modules/elastodyn/src/ElastoDyn_Registry.txt index 0ffcb4130..1dd0780be 100644 --- a/modules/elastodyn/src/ElastoDyn_Registry.txt +++ b/modules/elastodyn/src/ElastoDyn_Registry.txt @@ -169,8 +169,13 @@ typedef ^ ED_InputFile ReKi TeetSSSp - - - "Rotor-teeter soft-stop linear-spring typedef ^ ED_InputFile ReKi TeetHSSp - - - "Rotor-teeter hard-stop linear-spring constant" N-m/rad typedef ^ ED_InputFile IntKi YawFrctMod - - - "Identifier for YawFrctMod (0 [no friction], 1 [does not use Fz at bearing], 2 [does use Fz at bearing], or 3 [user defined model]" - typedef ^ ED_InputFile R8Ki M_CD - - - "Dynamic friction moment at null yaw rate" N-m +typedef ^ ED_InputFile R8Ki M_FCD - - - "Dynamic friction moment at null yaw rate proportional to yaw bearing shear force" N-m +typedef ^ ED_InputFile R8Ki M_MCD - - - "Dynamic friction moment at null yaw rate proportional to yaw bearing bending moment" N-m typedef ^ ED_InputFile R8Ki M_CSMAX - - - "Maximum Coulomb friction torque" N-m -typedef ^ ED_InputFile R8Ki sig_v - - - "Viscous friction coefficient" N-m/(rad/s) +typedef ^ ED_InputFile R8Ki M_FCSMAX - - - "Maximum Coulomb friction torque proportional to yaw bearing shear force" N-m +typedef ^ ED_InputFile R8Ki M_MCSMAX - - - "Maximum Coulomb friction torque proportional to yaw bearing bending moment" N-m +typedef ^ ED_InputFile R8Ki sig_v - - - "Linear viscous friction coefficient" N-m/(rad/s) +typedef ^ ED_InputFile R8Ki sig_v2 - - - "Quadratic viscous friction coefficient" N-m/(rad/s)^2 typedef ^ ED_InputFile ReKi GBoxEff - - - "Gearbox efficiency" % typedef ^ ED_InputFile ReKi GBRatio - - - "Gearbox ratio" - typedef ^ ED_InputFile ReKi DTTorSpr - - - "Drivetrain torsional spring" N-m/rad @@ -543,7 +548,8 @@ typedef ^ MiscVarType ReKi OgnlGeAzRo {:} - - "Original DOF_GeAz row in AugMat" typedef ^ MiscVarType R8Ki QD2T {:} - - "Solution (acceleration) vector; the first time derivative of QDT" typedef ^ MiscVarType Logical IgnoreMod - - - "whether to ignore the modulo in ED outputs (necessary for linearization perturbations)" - typedef ^ MiscVarType ReKi OgnlYawRow {:} - - "Original DOF_Yaw row in AugMat" - -typedef ^ MiscVarType ReKi FrcONcRt - - - "Fz acting on yaw bearing including inertial contributions" N +typedef ^ MiscVarType ReKi FrcONcRt 3 - - "Force acting on yaw bearing including inertial contributions" N +typedef ^ MiscVarType ReKi MomONcRt 3 - - "Moment acting on yaw bearing including inertial contributions" N-m typedef ^ MiscVarType ReKi YawFriMz - - - "External loading on yaw bearing not including inertial contributions" N-m # ..... Parameters ................................................................................................................ @@ -781,8 +787,13 @@ typedef ^ ParameterType LOGICAL BD4Blades - - - "flag to determine if BeamDyn is typedef ^ ParameterType LOGICAL RigidAero - - - "flag to determine if ElastoDyn if blades are rigid for aero -- when AeroDisk is used" - typedef ^ ParameterType IntKi YawFrctMod - - - "Identifier for YawFrctMod (0 [no friction], 1 [does not use Fz at bearing], or 2 [does use Fz at bearing]" - typedef ^ ParameterType R8Ki M_CD - - - "Dynamic friction moment at null yaw rate" N-m +typedef ^ ParameterType R8Ki M_FCD - - - "Dynamic friction moment at null yaw rate proportional to yaw bearing shear force" N-m +typedef ^ ParameterType R8Ki M_MCD - - - "Dynamic friction moment at null yaw rate proportional to yaw bearing bending moment" N-m typedef ^ ParameterType R8Ki M_CSMAX - - - "Maximum Coulomb friction torque" N-m -typedef ^ ParameterType R8Ki sig_v - - - "Viscous friction coefficient" N-m/(rad/s) +typedef ^ ParameterType R8Ki M_FCSMAX - - - "Maximum Coulomb friction torque proportional to yaw bearing shear force" N-m +typedef ^ ParameterType R8Ki M_MCSMAX - - - "Maximum Coulomb friction torque proportional to yaw bearing bending moment" N-m +typedef ^ ParameterType R8Ki sig_v - - - "Linear viscous friction coefficient" N-m/(rad/s) +typedef ^ ParameterType R8Ki sig_v2 - - - "Quadratic viscous friction coefficient" N-m/(rad/s)^2 #typedef ^ ParameterType R8Ki thr_omg - - - "Yaw rate stiction threshold" rad/s #typedef ^ ParameterType R8Ki thr_omgdot - - - "Yaw acceleration stiction threshold" rad/s^2 From 9717fe9caa8b0075696f39292dd36f3abfe66c61 Mon Sep 17 00:00:00 2001 From: Lu Wang Date: Thu, 12 Dec 2024 16:45:58 -0700 Subject: [PATCH 02/10] ED: For Yaw-bearing friction, add a new OmgCut input to define the region where the quadratic viscous friction should be linearized --- modules/elastodyn/src/ElastoDyn.f90 | 21 ++++++++++---------- modules/elastodyn/src/ElastoDyn_IO.f90 | 9 +++++++++ modules/elastodyn/src/ElastoDyn_Registry.txt | 2 ++ 3 files changed, 22 insertions(+), 10 deletions(-) diff --git a/modules/elastodyn/src/ElastoDyn.f90 b/modules/elastodyn/src/ElastoDyn.f90 index ad40583f6..759f9ef2a 100644 --- a/modules/elastodyn/src/ElastoDyn.f90 +++ b/modules/elastodyn/src/ElastoDyn.f90 @@ -3343,6 +3343,7 @@ SUBROUTINE SetPrimaryParameters( InitInp, p, InputFileData, ErrStat, ErrMsg ) p%M_MCSmax = InputFileData%M_MCSmax p%sig_v = InputFileData%sig_v p%sig_v2 = InputFileData%sig_v2 + p%OmgCut = InputFileData%OmgCut CALL AllocAry( p%TipMass, p%NumBl, 'TipMass', ErrStat, ErrMsg ) @@ -6421,7 +6422,7 @@ SUBROUTINE YawFriction( t, p, F, M, Mzz, Omg, OmgDot, YawFriMf ) REAL(ReKi), INTENT(OUT) :: YawFriMf !< The total friction torque (Coulomb + viscous). ! Local variables: - REAL(ReKi) :: temp, Fs, Mb ! It takes the value of Fz or -1. + REAL(ReKi) :: temp, Fs, Mb, Mf_vis ! temp takes the value of Fz or -1. SELECT CASE ( p%YawFrctMod ) @@ -6429,10 +6430,8 @@ SUBROUTINE YawFriction( t, p, F, M, Mzz, Omg, OmgDot, YawFriMf ) CASE ( 0_IntKi ) ! None! - YawFriMf = 0.0_ReKi - CASE ( 1_IntKi, 2_IntKi ) ! 1 = F and M not used. 2 = F and M used temp = -1.0_ReKi ! In the case of YawFrctMod=1 @@ -6445,27 +6444,29 @@ SUBROUTINE YawFriction( t, p, F, M, Mzz, Omg, OmgDot, YawFriMf ) Mb = SQRT(M(1)**2+M(2)**2) ! Effective bending moment on yaw bearing ENDIF - IF (EqualRealNos( Omg, 0.0_R8Ki ) )THEN + IF (EqualRealNos( Omg, 0.0_R8Ki )) THEN IF (EqualRealNos( OmgDot, 0.0_R8Ki )) THEN YawFriMf = -MIN( real(p%M_CSmax,ReKi) * ABS(temp) + real(p%M_FCSmax,ReKi) * Fs + real(p%M_MCSmax,ReKi) * Mb, ABS(real(Mzz,ReKi)) ) * SIGN(1.0_ReKi, real(Mzz,ReKi)) ELSE YawFriMf = -MIN( real(p%M_CD, ReKi) * ABS(temp) + real(p%M_FCD, ReKi) * Fs + real(p%M_MCD, ReKi) * Mb, ABS(real(Mzz,ReKi)) ) * SIGN(1.0_ReKi, real(Mzz,ReKi)) ENDIF ELSE - YawFriMf = ( real(p%M_CD,ReKi) * temp - real(p%M_FCD,ReKi) * Fs - real(p%M_MCD,ReKi) * Mb ) * sign(1.0_ReKi, real(Omg,ReKi)) & ! Coulomb friction - - real(p%sig_v,ReKi) * real(Omg,ReKi) - real(p%sig_v2,ReKi) * real(Omg,ReKi) * ABS(real(Omg,ReKi)) ! Viscous friction + ! Viscous friction + IF ( ABS(Omg) > p%OmgCut ) THEN ! Full quadratic viscous friction + Mf_vis = - real(p%sig_v,ReKi) * real(Omg,ReKi) - real(p%sig_v2,ReKi) * real(Omg,ReKi) * ABS(real(Omg,ReKi)) + ELSE ! Linearized viscous friction + Mf_vis = - ( real(p%sig_v,ReKi) + real(p%sig_v2,ReKi) * real(p%OmgCut,ReKi) ) * real(Omg,ReKi) + ENDIF + YawFriMf = ( real(p%M_CD,ReKi) * temp - real(p%M_FCD,ReKi) * Fs - real(p%M_MCD,ReKi) * Mb ) * sign(1.0_ReKi, real(Omg,ReKi)) & ! Coulomb friction + + Mf_vis ENDIF - CASE ( 3_IntKi ) ! User-defined YawFriMf model. >>>> NOT IMPLEMENTED YET - CALL UserYawFrict ( t, F, M, Mzz, Omg, OmgDot, p%RootName, YawFriMf ) - END SELECT - RETURN END SUBROUTINE YawFriction !---------------------------------------------------------------------------------------------------------------------------------- diff --git a/modules/elastodyn/src/ElastoDyn_IO.f90 b/modules/elastodyn/src/ElastoDyn_IO.f90 index e892c00ef..5bcd9a63b 100644 --- a/modules/elastodyn/src/ElastoDyn_IO.f90 +++ b/modules/elastodyn/src/ElastoDyn_IO.f90 @@ -3339,6 +3339,14 @@ SUBROUTINE ReadPrimaryFile( InputFile, InputFileData, BldFile, FurlFile, TwrFile RETURN END IF + ! OmgCut - Yaw angular velocity cutoff below which viscous friction is to be linearized (rad/s): + CALL ReadVar( UnIn, InputFile, InputFileData%OmgCut, "OmgCut", "Nacelle yaw angular velocity cutoff below which viscous friction is to be linearized (rad/s)", ErrStat2, ErrMsg2, UnEc) + CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + IF ( ErrStat >= AbortErrLev ) THEN + CALL Cleanup() + RETURN + END IF + !---------------------- DRIVETRAIN ---------------------------------------------- CALL ReadCom( UnIn, InputFile, 'Section Header: Drivetrain', ErrStat2, ErrMsg2, UnEc ) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) @@ -4378,6 +4386,7 @@ SUBROUTINE ValidatePrimaryData( InputFileData, BD4Blades, Linearize, MHK, ErrSta IF ( InputFileData%M_MCSmax < 0_R8Ki ) CALL SetErrStat( ErrID_Fatal, 'M_MCSmax must be greater than or equal to 0.',ErrStat,ErrMsg,RoutineName ) IF ( InputFileData%sig_v < 0_R8Ki ) CALL SetErrStat( ErrID_Fatal, 'sig_v must be greater than or equal to 0.',ErrStat,ErrMsg,RoutineName ) IF ( InputFileData%sig_v2 < 0_R8Ki ) CALL SetErrStat( ErrID_Fatal, 'sig_v2 must be greater than or equal to 0.',ErrStat,ErrMsg,RoutineName ) + IF ( InputFileData%OmgCut < 0_R8Ki ) CALL SetErrStat( ErrID_Fatal, 'OmgCut must be greater than or equal to 0.',ErrStat,ErrMsg,RoutineName ) !bjj: since ED doesn't actually use OutFmt at this point, I'm going to remove this check and warning message !!!! ! Check that InputFileData%OutFmt is a valid format specifier and will fit over the column headings diff --git a/modules/elastodyn/src/ElastoDyn_Registry.txt b/modules/elastodyn/src/ElastoDyn_Registry.txt index 1dd0780be..2210e9b57 100644 --- a/modules/elastodyn/src/ElastoDyn_Registry.txt +++ b/modules/elastodyn/src/ElastoDyn_Registry.txt @@ -176,6 +176,7 @@ typedef ^ ED_InputFile R8Ki M_FCSMAX - - - "Maximum typedef ^ ED_InputFile R8Ki M_MCSMAX - - - "Maximum Coulomb friction torque proportional to yaw bearing bending moment" N-m typedef ^ ED_InputFile R8Ki sig_v - - - "Linear viscous friction coefficient" N-m/(rad/s) typedef ^ ED_InputFile R8Ki sig_v2 - - - "Quadratic viscous friction coefficient" N-m/(rad/s)^2 +typedef ^ ED_InputFile R8Ki OmgCut - - - "Nacelle yaw angular velocity cutoff below which viscous friction is to be linearized" rad/s typedef ^ ED_InputFile ReKi GBoxEff - - - "Gearbox efficiency" % typedef ^ ED_InputFile ReKi GBRatio - - - "Gearbox ratio" - typedef ^ ED_InputFile ReKi DTTorSpr - - - "Drivetrain torsional spring" N-m/rad @@ -794,6 +795,7 @@ typedef ^ ParameterType R8Ki M_FCSMAX - - - "Maximum typedef ^ ParameterType R8Ki M_MCSMAX - - - "Maximum Coulomb friction torque proportional to yaw bearing bending moment" N-m typedef ^ ParameterType R8Ki sig_v - - - "Linear viscous friction coefficient" N-m/(rad/s) typedef ^ ParameterType R8Ki sig_v2 - - - "Quadratic viscous friction coefficient" N-m/(rad/s)^2 +typedef ^ ParameterType R8Ki OmgCut - - - "Nacelle yaw angular velocity cutoff below which viscous friction is to be linearized" rad/s #typedef ^ ParameterType R8Ki thr_omg - - - "Yaw rate stiction threshold" rad/s #typedef ^ ParameterType R8Ki thr_omgdot - - - "Yaw acceleration stiction threshold" rad/s^2 From e815575349922cb3fbbad8878860dd8e0752c498 Mon Sep 17 00:00:00 2001 From: Lu Wang Date: Sat, 14 Dec 2024 14:40:17 -0700 Subject: [PATCH 03/10] ED: Update the arguments of UserYawFrict to match the updated YawFriction subroutine --- modules/elastodyn/src/ED_UserSubs.f90 | 5 +- modules/elastodyn/src/ElastoDyn_Types.f90 | 58 +++++++++++++++++++++-- 2 files changed, 58 insertions(+), 5 deletions(-) diff --git a/modules/elastodyn/src/ED_UserSubs.f90 b/modules/elastodyn/src/ED_UserSubs.f90 index 47e2abd8f..29825d65f 100644 --- a/modules/elastodyn/src/ED_UserSubs.f90 +++ b/modules/elastodyn/src/ED_UserSubs.f90 @@ -101,7 +101,7 @@ SUBROUTINE UserTeet ( TeetDef, TeetRate, ZTime, DirRoot, TeetMom ) RETURN END SUBROUTINE UserTeet !======================================================================= -SUBROUTINE UserYawFrict ( ZTime, Fz, Mzz, Omg, OmgDot, DirRoot, YawFriMf ) +SUBROUTINE UserYawFrict ( ZTime, F, M, Mzz, Omg, OmgDot, DirRoot, YawFriMf ) ! This is a dummy routine for holding the place of a user-specified ! Yaw Friction. Modify this code to create your own device. @@ -115,7 +115,8 @@ SUBROUTINE UserYawFrict ( ZTime, Fz, Mzz, Omg, OmgDot, DirRoot, YawFriMf ) ! Passed Variables: REAL(DbKi), INTENT(IN ) :: ZTime ! Current simulation time, sec. -REAL(R8Ki), INTENT(IN ) :: Fz, Mzz ! Yaw Bering normal force (positive if upward) and torque, N and N*m +REAL(R8Ki), INTENT(IN ) :: F(3),M(3) ! Yaw bearing force and moment N and N*m +REAL(R8Ki), INTENT(IN ) :: Mzz ! External axial yaw bearing torque N*m REAL(R8Ki), INTENT(IN ) :: Omg ! Yaw rotational speed, rad/s. REAL(R8Ki), INTENT(IN ) :: OmgDot ! Yaw rotational acceleration, rad/s^2. diff --git a/modules/elastodyn/src/ElastoDyn_Types.f90 b/modules/elastodyn/src/ElastoDyn_Types.f90 index db494845e..adc0c3f8c 100644 --- a/modules/elastodyn/src/ElastoDyn_Types.f90 +++ b/modules/elastodyn/src/ElastoDyn_Types.f90 @@ -191,8 +191,14 @@ MODULE ElastoDyn_Types REAL(ReKi) :: TeetHSSp = 0.0_ReKi !< Rotor-teeter hard-stop linear-spring constant [N-m/rad] INTEGER(IntKi) :: YawFrctMod = 0_IntKi !< Identifier for YawFrctMod (0 [no friction], 1 [does not use Fz at bearing], 2 [does use Fz at bearing], or 3 [user defined model] [-] REAL(R8Ki) :: M_CD = 0.0_R8Ki !< Dynamic friction moment at null yaw rate [N-m] + REAL(R8Ki) :: M_FCD = 0.0_R8Ki !< Dynamic friction moment at null yaw rate proportional to yaw bearing shear force [N-m] + REAL(R8Ki) :: M_MCD = 0.0_R8Ki !< Dynamic friction moment at null yaw rate proportional to yaw bearing bending moment [N-m] REAL(R8Ki) :: M_CSMAX = 0.0_R8Ki !< Maximum Coulomb friction torque [N-m] - REAL(R8Ki) :: sig_v = 0.0_R8Ki !< Viscous friction coefficient [N-m/(rad/s)] + REAL(R8Ki) :: M_FCSMAX = 0.0_R8Ki !< Maximum Coulomb friction torque proportional to yaw bearing shear force [N-m] + REAL(R8Ki) :: M_MCSMAX = 0.0_R8Ki !< Maximum Coulomb friction torque proportional to yaw bearing bending moment [N-m] + REAL(R8Ki) :: sig_v = 0.0_R8Ki !< Linear viscous friction coefficient [N-m/(rad/s)] + REAL(R8Ki) :: sig_v2 = 0.0_R8Ki !< Quadratic viscous friction coefficient [N-m/(rad/s)^2] + REAL(R8Ki) :: OmgCut = 0.0_R8Ki !< Nacelle yaw angular velocity cutoff below which viscous friction is to be linearized [rad/s] REAL(ReKi) :: GBoxEff = 0.0_ReKi !< Gearbox efficiency [%] REAL(ReKi) :: GBRatio = 0.0_ReKi !< Gearbox ratio [-] REAL(ReKi) :: DTTorSpr = 0.0_ReKi !< Drivetrain torsional spring [N-m/rad] @@ -552,7 +558,8 @@ MODULE ElastoDyn_Types REAL(R8Ki) , DIMENSION(:), ALLOCATABLE :: QD2T !< Solution (acceleration) vector; the first time derivative of QDT [-] LOGICAL :: IgnoreMod = .false. !< whether to ignore the modulo in ED outputs (necessary for linearization perturbations) [-] REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: OgnlYawRow !< Original DOF_Yaw row in AugMat [-] - REAL(ReKi) :: FrcONcRt = 0.0_ReKi !< Fz acting on yaw bearing including inertial contributions [N] + REAL(ReKi) , DIMENSION(1:3) :: FrcONcRt = 0.0_ReKi !< Force acting on yaw bearing including inertial contributions [N] + REAL(ReKi) , DIMENSION(1:3) :: MomONcRt = 0.0_ReKi !< Moment acting on yaw bearing including inertial contributions [N-m] REAL(ReKi) :: YawFriMz = 0.0_ReKi !< External loading on yaw bearing not including inertial contributions [N-m] END TYPE ED_MiscVarType ! ======================= @@ -795,8 +802,14 @@ MODULE ElastoDyn_Types LOGICAL :: RigidAero = .false. !< flag to determine if ElastoDyn if blades are rigid for aero -- when AeroDisk is used [-] INTEGER(IntKi) :: YawFrctMod = 0_IntKi !< Identifier for YawFrctMod (0 [no friction], 1 [does not use Fz at bearing], or 2 [does use Fz at bearing] [-] REAL(R8Ki) :: M_CD = 0.0_R8Ki !< Dynamic friction moment at null yaw rate [N-m] + REAL(R8Ki) :: M_FCD = 0.0_R8Ki !< Dynamic friction moment at null yaw rate proportional to yaw bearing shear force [N-m] + REAL(R8Ki) :: M_MCD = 0.0_R8Ki !< Dynamic friction moment at null yaw rate proportional to yaw bearing bending moment [N-m] REAL(R8Ki) :: M_CSMAX = 0.0_R8Ki !< Maximum Coulomb friction torque [N-m] - REAL(R8Ki) :: sig_v = 0.0_R8Ki !< Viscous friction coefficient [N-m/(rad/s)] + REAL(R8Ki) :: M_FCSMAX = 0.0_R8Ki !< Maximum Coulomb friction torque proportional to yaw bearing shear force [N-m] + REAL(R8Ki) :: M_MCSMAX = 0.0_R8Ki !< Maximum Coulomb friction torque proportional to yaw bearing bending moment [N-m] + REAL(R8Ki) :: sig_v = 0.0_R8Ki !< Linear viscous friction coefficient [N-m/(rad/s)] + REAL(R8Ki) :: sig_v2 = 0.0_R8Ki !< Quadratic viscous friction coefficient [N-m/(rad/s)^2] + REAL(R8Ki) :: OmgCut = 0.0_R8Ki !< Nacelle yaw angular velocity cutoff below which viscous friction is to be linearized [rad/s] INTEGER(IntKi) :: BldNd_NumOuts = 0_IntKi !< Number of requested output channels per blade node (ED_AllBldNdOuts) [-] INTEGER(IntKi) :: BldNd_TotNumOuts = 0_IntKi !< Total number of requested output channels of blade node information (BldNd_NumOuts * BldNd_BlOutNd * BldNd_BladesOut -- ED_AllBldNdOuts) [-] TYPE(OutParmType) , DIMENSION(:), ALLOCATABLE :: BldNd_OutParam !< Names and units (and other characteristics) of all requested output parameters [-] @@ -1709,8 +1722,14 @@ subroutine ED_CopyInputFile(SrcInputFileData, DstInputFileData, CtrlCode, ErrSta DstInputFileData%TeetHSSp = SrcInputFileData%TeetHSSp DstInputFileData%YawFrctMod = SrcInputFileData%YawFrctMod DstInputFileData%M_CD = SrcInputFileData%M_CD + DstInputFileData%M_FCD = SrcInputFileData%M_FCD + DstInputFileData%M_MCD = SrcInputFileData%M_MCD DstInputFileData%M_CSMAX = SrcInputFileData%M_CSMAX + DstInputFileData%M_FCSMAX = SrcInputFileData%M_FCSMAX + DstInputFileData%M_MCSMAX = SrcInputFileData%M_MCSMAX DstInputFileData%sig_v = SrcInputFileData%sig_v + DstInputFileData%sig_v2 = SrcInputFileData%sig_v2 + DstInputFileData%OmgCut = SrcInputFileData%OmgCut DstInputFileData%GBoxEff = SrcInputFileData%GBoxEff DstInputFileData%GBRatio = SrcInputFileData%GBRatio DstInputFileData%DTTorSpr = SrcInputFileData%DTTorSpr @@ -2078,8 +2097,14 @@ subroutine ED_PackInputFile(RF, Indata) call RegPack(RF, InData%TeetHSSp) call RegPack(RF, InData%YawFrctMod) call RegPack(RF, InData%M_CD) + call RegPack(RF, InData%M_FCD) + call RegPack(RF, InData%M_MCD) call RegPack(RF, InData%M_CSMAX) + call RegPack(RF, InData%M_FCSMAX) + call RegPack(RF, InData%M_MCSMAX) call RegPack(RF, InData%sig_v) + call RegPack(RF, InData%sig_v2) + call RegPack(RF, InData%OmgCut) call RegPack(RF, InData%GBoxEff) call RegPack(RF, InData%GBRatio) call RegPack(RF, InData%DTTorSpr) @@ -2278,8 +2303,14 @@ subroutine ED_UnPackInputFile(RF, OutData) call RegUnpack(RF, OutData%TeetHSSp); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%YawFrctMod); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%M_CD); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%M_FCD); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%M_MCD); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%M_CSMAX); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%M_FCSMAX); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%M_MCSMAX); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%sig_v); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%sig_v2); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%OmgCut); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%GBoxEff); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%GBRatio); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%DTTorSpr); if (RegCheckErr(RF, RoutineName)) return @@ -4959,6 +4990,7 @@ subroutine ED_CopyMisc(SrcMiscData, DstMiscData, CtrlCode, ErrStat, ErrMsg) DstMiscData%OgnlYawRow = SrcMiscData%OgnlYawRow end if DstMiscData%FrcONcRt = SrcMiscData%FrcONcRt + DstMiscData%MomONcRt = SrcMiscData%MomONcRt DstMiscData%YawFriMz = SrcMiscData%YawFriMz end subroutine @@ -5018,6 +5050,7 @@ subroutine ED_PackMisc(RF, Indata) call RegPack(RF, InData%IgnoreMod) call RegPackAlloc(RF, InData%OgnlYawRow) call RegPack(RF, InData%FrcONcRt) + call RegPack(RF, InData%MomONcRt) call RegPack(RF, InData%YawFriMz) if (RegCheckErr(RF, RoutineName)) return end subroutine @@ -5042,6 +5075,7 @@ subroutine ED_UnPackMisc(RF, OutData) call RegUnpack(RF, OutData%IgnoreMod); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%OgnlYawRow); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%FrcONcRt); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%MomONcRt); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%YawFriMz); if (RegCheckErr(RF, RoutineName)) return end subroutine @@ -5985,8 +6019,14 @@ subroutine ED_CopyParam(SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg) DstParamData%RigidAero = SrcParamData%RigidAero DstParamData%YawFrctMod = SrcParamData%YawFrctMod DstParamData%M_CD = SrcParamData%M_CD + DstParamData%M_FCD = SrcParamData%M_FCD + DstParamData%M_MCD = SrcParamData%M_MCD DstParamData%M_CSMAX = SrcParamData%M_CSMAX + DstParamData%M_FCSMAX = SrcParamData%M_FCSMAX + DstParamData%M_MCSMAX = SrcParamData%M_MCSMAX DstParamData%sig_v = SrcParamData%sig_v + DstParamData%sig_v2 = SrcParamData%sig_v2 + DstParamData%OmgCut = SrcParamData%OmgCut DstParamData%BldNd_NumOuts = SrcParamData%BldNd_NumOuts DstParamData%BldNd_TotNumOuts = SrcParamData%BldNd_TotNumOuts if (allocated(SrcParamData%BldNd_OutParam)) then @@ -6492,8 +6532,14 @@ subroutine ED_PackParam(RF, Indata) call RegPack(RF, InData%RigidAero) call RegPack(RF, InData%YawFrctMod) call RegPack(RF, InData%M_CD) + call RegPack(RF, InData%M_FCD) + call RegPack(RF, InData%M_MCD) call RegPack(RF, InData%M_CSMAX) + call RegPack(RF, InData%M_FCSMAX) + call RegPack(RF, InData%M_MCSMAX) call RegPack(RF, InData%sig_v) + call RegPack(RF, InData%sig_v2) + call RegPack(RF, InData%OmgCut) call RegPack(RF, InData%BldNd_NumOuts) call RegPack(RF, InData%BldNd_TotNumOuts) call RegPack(RF, allocated(InData%BldNd_OutParam)) @@ -6757,8 +6803,14 @@ subroutine ED_UnPackParam(RF, OutData) call RegUnpack(RF, OutData%RigidAero); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%YawFrctMod); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%M_CD); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%M_FCD); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%M_MCD); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%M_CSMAX); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%M_FCSMAX); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%M_MCSMAX); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%sig_v); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%sig_v2); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%OmgCut); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%BldNd_NumOuts); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%BldNd_TotNumOuts); if (RegCheckErr(RF, RoutineName)) return if (allocated(OutData%BldNd_OutParam)) deallocate(OutData%BldNd_OutParam) From 4cb25d84310e831c784cf2c1c48f7cad7de962e5 Mon Sep 17 00:00:00 2001 From: Lu Wang Date: Sat, 14 Dec 2024 18:09:33 -0700 Subject: [PATCH 04/10] ED: Fix single-precision build with extended yaw-friction modeling --- modules/elastodyn/src/ED_UserSubs.f90 | 2 +- modules/elastodyn/src/ElastoDyn.f90 | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/elastodyn/src/ED_UserSubs.f90 b/modules/elastodyn/src/ED_UserSubs.f90 index 29825d65f..42372a428 100644 --- a/modules/elastodyn/src/ED_UserSubs.f90 +++ b/modules/elastodyn/src/ED_UserSubs.f90 @@ -115,7 +115,7 @@ SUBROUTINE UserYawFrict ( ZTime, F, M, Mzz, Omg, OmgDot, DirRoot, YawFriMf ) ! Passed Variables: REAL(DbKi), INTENT(IN ) :: ZTime ! Current simulation time, sec. -REAL(R8Ki), INTENT(IN ) :: F(3),M(3) ! Yaw bearing force and moment N and N*m +REAL(ReKi), INTENT(IN ) :: F(3),M(3) ! Yaw bearing force and moment N and N*m REAL(R8Ki), INTENT(IN ) :: Mzz ! External axial yaw bearing torque N*m REAL(R8Ki), INTENT(IN ) :: Omg ! Yaw rotational speed, rad/s. REAL(R8Ki), INTENT(IN ) :: OmgDot ! Yaw rotational acceleration, rad/s^2. diff --git a/modules/elastodyn/src/ElastoDyn.f90 b/modules/elastodyn/src/ElastoDyn.f90 index 759f9ef2a..cbfdace5c 100644 --- a/modules/elastodyn/src/ElastoDyn.f90 +++ b/modules/elastodyn/src/ElastoDyn.f90 @@ -6415,7 +6415,7 @@ SUBROUTINE YawFriction( t, p, F, M, Mzz, Omg, OmgDot, YawFriMf ) ! Passed Variables: REAL(DbKi), INTENT(IN) :: t !< simulation time TYPE(ED_ParameterType), INTENT(IN) :: p !< parameters from the structural dynamics module - REAL(R8Ki), INTENT(IN ) :: F(3), M(3) !< Effective yaw bearing force and moment + REAL(ReKi), INTENT(IN ) :: F(3), M(3) !< Effective yaw bearing force and moment REAL(R8Ki), INTENT(IN ) :: Mzz !< External yaw bearing torque REAL(R8Ki), INTENT(IN ) :: Omg !< The yaw rate (rotational speed), x%QDT(DOF_Yaw). REAL(R8Ki), INTENT(IN ) :: OmgDot !< The yaw acceleration (derivative of rotational speed), x%QD2T(DOF_Yaw). @@ -6439,7 +6439,7 @@ SUBROUTINE YawFriction( t, p, F, M, Mzz, Omg, OmgDot, YawFriMf ) Mb = 0.0_ReKi IF (p%YawFrctMod .EQ. 2) THEN - temp = MIN(0.0_R8Ki, F(3)) ! In the case of YawFrctMod=2 + temp = MIN(0.0_ReKi, F(3)) ! In the case of YawFrctMod=2 Fs = SQRT(F(1)**2+F(2)**2) ! Effective shear force on yaw bearing Mb = SQRT(M(1)**2+M(2)**2) ! Effective bending moment on yaw bearing ENDIF From f42d536fc58a8657529a61f37a94ed1afaad6255 Mon Sep 17 00:00:00 2001 From: Lu Wang Date: Sat, 14 Dec 2024 18:10:42 -0700 Subject: [PATCH 05/10] Update r-test pointer --- reg_tests/r-test | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reg_tests/r-test b/reg_tests/r-test index 16f421779..b3824f2d3 160000 --- a/reg_tests/r-test +++ b/reg_tests/r-test @@ -1 +1 @@ -Subproject commit 16f42177996ce19556d7848b72a123764a6c7297 +Subproject commit b3824f2d3a4cd4cb826aa4ac95b6e39a99e66d43 From 3d6fdd56cbbc0de85d366f1fe4d4bdc0c053882e Mon Sep 17 00:00:00 2001 From: Lu Wang Date: Sun, 15 Dec 2024 14:50:57 -0700 Subject: [PATCH 06/10] ED: Update ED documentation for the extended yaw-friction model --- .../user/elastodyn/figs/YawFrictionModel.jpg | Bin 12169 -> 78139 bytes docs/source/user/elastodyn/input.rst | 20 ++++-- docs/source/user/elastodyn/theory.rst | 63 +++++++++++++----- 3 files changed, 62 insertions(+), 21 deletions(-) diff --git a/docs/source/user/elastodyn/figs/YawFrictionModel.jpg b/docs/source/user/elastodyn/figs/YawFrictionModel.jpg index aa39021ee78577eedfdf67cb8cc94123caed3eaa..4a89c6ca0ae4dc814dbdd732aea2fba61a44da8e 100644 GIT binary patch literal 78139 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

~U?iD!q(8t^&)9-sua{63K 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 literal 12169 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 E0j@VqeE Date: Sun, 15 Dec 2024 15:00:41 -0700 Subject: [PATCH 07/10] ED: Update theory.rst to correct formatting errors --- docs/source/user/elastodyn/theory.rst | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/source/user/elastodyn/theory.rst b/docs/source/user/elastodyn/theory.rst index 7808e50c7..936cb8427 100644 --- a/docs/source/user/elastodyn/theory.rst +++ b/docs/source/user/elastodyn/theory.rst @@ -168,7 +168,7 @@ The yaw-friction moment as a function of yaw rate (:math:`\omega`) is shown belo Yaw-friction model -When ``YawFrctMod``=1, the maximum static or dynamic Coulomb friction does not depend on the external load on the yaw bearing. The yaw-friction torque :math:`M_f` can be calculated as follows. +When ``YawFrctMod`` = 1, the maximum static or dynamic Coulomb friction does not depend on the external load on the yaw bearing. The yaw-friction torque :math:`M_f` can be calculated as follows. If :math:`\omega\neq0`, we have dynamic friction of the form .. math:: @@ -201,13 +201,13 @@ If :math:`\omega=0` and :math:`\dot{\omega}=0`, we have static Coulomb friction where :math:`\mu_s` is the static Coulomb friction coefficient. The product :math:`\mu_s\bar{D}` is specified in the input file through ``M_CSmax``. -When ``YawFrctMod``=2, the maximum static or dynamic Coulomb friction depends on the external load on the yaw bearing, with proportional contributions from :math:`|F_z|`, the magnitude of the bearing axial load, if :math:`F_z<0`, from the bearing shear force magnitude, :math:`\sqrt{F_x^2+F_y^2}`, and from the bearing bending moment magnitude, :math:`\sqrt{M_x^2+M_y^2}`. +When ``YawFrctMod`` = 2, the maximum static or dynamic Coulomb friction depends on the external load on the yaw bearing, with proportional contributions from :math:`|F_z|`, the magnitude of the bearing axial load, if :math:`F_z<0`, from the bearing shear force magnitude, :math:`\sqrt{F_x^2+F_y^2}`, and from the bearing bending moment magnitude, :math:`\sqrt{M_x^2+M_y^2}`. If :math:`\omega\neq0`, we have dynamic friction of the form .. math:: M_f = \left(\mu_d\bar{D}\text{min}(0,F_z)-\mu_{df}\bar{D}\sqrt{F_x^2+F_y^2}-\mu_{dm}\sqrt{M_x^2+M_y^2}\right)\times\text{sign}(\omega) - M_{f,vis}, -where :math:`M_{f,vis}` is defined in the same way as when ``YawFrctMod``=1. The product :math:`\mu_{df}\bar{D}` and :math:`\mu_{dm}` are specified in the input file through ``M_FCD`` and ``M_MCD``, respectively. +where :math:`M_{f,vis}` is defined in the same way as when ``YawFrctMod`` = 1. The product :math:`\mu_{df}\bar{D}` and :math:`\mu_{dm}` are specified in the input file through ``M_FCD`` and ``M_MCD``, respectively. If :math:`\omega=0` and :math:`\dot{\omega}\neq 0`, we have a modified dynamic Coulomb friction of the form .. math:: @@ -216,14 +216,14 @@ If :math:`\omega=0` and :math:`\dot{\omega}\neq 0`, we have a modified dynamic C If :math:`\omega=0` and :math:`\dot{\omega}=0`, we have static Coulomb friction of the form .. math:: - M_f = -\text{min}\left(\mu_s\bar{D}|\text{min}(0,F_z)| + \mu_{sf}\bar{D}\sqrt{F_x^2+F_y^2} + \mu_{sm}\sqrt{M_x^2+M_y^2},|M_z|\right)\times\text{sign}(M_z). + M_f = -\text{min}\left(\mu_s\bar{D}|\text{min}(0,F_z)| + \mu_{sf}\bar{D}\sqrt{F_x^2+F_y^2} + \mu_{sm}\sqrt{M_x^2+M_y^2},|M_z|\right)\times\text{sign}(M_z), where the product :math:`\mu_{sf}\bar{D}` and :math:`\mu_{sm}` are specified in the input file through ``M_FCSmax`` and ``M_MCSmax``, respectively. The static 'stiction' (where the static contribution exceeds the dynamic Coulomb friction) is only applied if both the yaw rotational velocity and acceleration at the current time-step are zero. The static portion of the friction is omitted if the rotational acceleration is not null. This is to account for the fact that a 'warm' joint may not feel stiction when crossing through zero velocity in a dynamic sense :cite:`ed-hammam2023`. -When :math:`\omega=0`, the yaw-bearing static or dynamic friction is formulated such that the frictional resistance opposes the external applied moment, :math:M_z`, without overcoming it. +When :math:`\omega=0`, the yaw-bearing static or dynamic friction is formulated such that the frictional resistance opposes the external applied moment, :math:`M_z`, without overcoming it. .. _ed_dev_notes: From c37912c36a68d450537a0e1a959d26567c2df1ac Mon Sep 17 00:00:00 2001 From: Lu Wang Date: Sun, 15 Dec 2024 17:24:14 -0700 Subject: [PATCH 08/10] ED: Additional input checks to make sure the static Coulomb friction coefficients for the yaw bearing are greater than or equal to their dynamic counterparts --- modules/elastodyn/src/ElastoDyn_IO.f90 | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/modules/elastodyn/src/ElastoDyn_IO.f90 b/modules/elastodyn/src/ElastoDyn_IO.f90 index 5bcd9a63b..5e32e39bd 100644 --- a/modules/elastodyn/src/ElastoDyn_IO.f90 +++ b/modules/elastodyn/src/ElastoDyn_IO.f90 @@ -4378,15 +4378,20 @@ SUBROUTINE ValidatePrimaryData( InputFileData, BD4Blades, Linearize, MHK, ErrSta IF ( ( InputFileData%YawFrctMod /= 0_IntKi ) .AND. ( InputFileData%YawFrctMod /= 1_IntKi ) .AND. & ( InputFileData%YawFrctMod /= 2_IntKi ) .AND. ( InputFileData%YawFrctMod /= 3_IntKi )) & CALL SetErrStat( ErrID_Fatal, 'YawFrctMod must be 0, 1, 2, or 3',ErrStat,ErrMsg,RoutineName) - IF ( InputFileData%M_CD < 0_R8Ki ) CALL SetErrStat( ErrID_Fatal, 'M_CD must be greater than or equal to 0.',ErrStat,ErrMsg,RoutineName ) - IF ( InputFileData%M_FCD < 0_R8Ki ) CALL SetErrStat( ErrID_Fatal, 'M_FCD must be greater than or equal to 0.',ErrStat,ErrMsg,RoutineName ) - IF ( InputFileData%M_MCD < 0_R8Ki ) CALL SetErrStat( ErrID_Fatal, 'M_MCD must be greater than or equal to 0.',ErrStat,ErrMsg,RoutineName ) - IF ( InputFileData%M_CSmax < 0_R8Ki ) CALL SetErrStat( ErrID_Fatal, 'M_CSmax must be greater than or equal to 0.',ErrStat,ErrMsg,RoutineName ) + IF ( InputFileData%M_CD < 0_R8Ki ) CALL SetErrStat( ErrID_Fatal, 'M_CD must be greater than or equal to 0.', ErrStat,ErrMsg,RoutineName ) + IF ( InputFileData%M_FCD < 0_R8Ki ) CALL SetErrStat( ErrID_Fatal, 'M_FCD must be greater than or equal to 0.', ErrStat,ErrMsg,RoutineName ) + IF ( InputFileData%M_MCD < 0_R8Ki ) CALL SetErrStat( ErrID_Fatal, 'M_MCD must be greater than or equal to 0.', ErrStat,ErrMsg,RoutineName ) + IF ( InputFileData%M_CSmax < 0_R8Ki ) CALL SetErrStat( ErrID_Fatal, 'M_CSmax must be greater than or equal to 0.', ErrStat,ErrMsg,RoutineName ) IF ( InputFileData%M_FCSmax < 0_R8Ki ) CALL SetErrStat( ErrID_Fatal, 'M_FCSmax must be greater than or equal to 0.',ErrStat,ErrMsg,RoutineName ) IF ( InputFileData%M_MCSmax < 0_R8Ki ) CALL SetErrStat( ErrID_Fatal, 'M_MCSmax must be greater than or equal to 0.',ErrStat,ErrMsg,RoutineName ) - IF ( InputFileData%sig_v < 0_R8Ki ) CALL SetErrStat( ErrID_Fatal, 'sig_v must be greater than or equal to 0.',ErrStat,ErrMsg,RoutineName ) - IF ( InputFileData%sig_v2 < 0_R8Ki ) CALL SetErrStat( ErrID_Fatal, 'sig_v2 must be greater than or equal to 0.',ErrStat,ErrMsg,RoutineName ) - IF ( InputFileData%OmgCut < 0_R8Ki ) CALL SetErrStat( ErrID_Fatal, 'OmgCut must be greater than or equal to 0.',ErrStat,ErrMsg,RoutineName ) + IF ( InputFileData%sig_v < 0_R8Ki ) CALL SetErrStat( ErrID_Fatal, 'sig_v must be greater than or equal to 0.', ErrStat,ErrMsg,RoutineName ) + IF ( InputFileData%sig_v2 < 0_R8Ki ) CALL SetErrStat( ErrID_Fatal, 'sig_v2 must be greater than or equal to 0.', ErrStat,ErrMsg,RoutineName ) + IF ( InputFileData%OmgCut < 0_R8Ki ) CALL SetErrStat( ErrID_Fatal, 'OmgCut must be greater than or equal to 0.', ErrStat,ErrMsg,RoutineName ) + + ! The static Coulomb friction coefficients must be greater than or equal to their dynamic counterparts. + IF ( InputFileData%M_CSmax < InputFileData%M_CD ) CALL SetErrStat( ErrID_Fatal, 'M_CSmax must be greater than or equal to M_CD.', ErrStat,ErrMsg,RoutineName ) + IF ( InputFileData%M_FCSmax < InputFileData%M_FCD ) CALL SetErrStat( ErrID_Fatal, 'M_FCSmax must be greater than or equal to M_FCD.',ErrStat,ErrMsg,RoutineName ) + IF ( InputFileData%M_MCSmax < InputFileData%M_MCD ) CALL SetErrStat( ErrID_Fatal, 'M_MCSmax must be greater than or equal to M_MCD.',ErrStat,ErrMsg,RoutineName ) !bjj: since ED doesn't actually use OutFmt at this point, I'm going to remove this check and warning message !!!! ! Check that InputFileData%OutFmt is a valid format specifier and will fit over the column headings From 3408f0f7a95afb11d0a1ed1e11a2f4cbb164e5e3 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Mon, 16 Dec 2024 10:17:17 -0700 Subject: [PATCH 09/10] docs: minor format fix --- docs/source/user/elastodyn/theory.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/user/elastodyn/theory.rst b/docs/source/user/elastodyn/theory.rst index 936cb8427..ae881d842 100644 --- a/docs/source/user/elastodyn/theory.rst +++ b/docs/source/user/elastodyn/theory.rst @@ -158,7 +158,7 @@ The total moment on the given degree of freedom is: .. _ed_yawfriction_theory: Yaw-friction model ------------- +------------------ A yaw-friction model is implemented in ElastoDyn based on a Coulomb-viscous approach. The yaw-friction moment as a function of yaw rate (:math:`\omega`) is shown below in :numref:`figYawFriction` From 09b1e426812bc8301e8bc90f9205906dc5b36832 Mon Sep 17 00:00:00 2001 From: andrew-platt Date: Mon, 16 Dec 2024 10:44:29 -0700 Subject: [PATCH 10/10] docs: ed, minor formatting of equations. --- docs/source/user/elastodyn/theory.rst | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/docs/source/user/elastodyn/theory.rst b/docs/source/user/elastodyn/theory.rst index ae881d842..d4756dd0c 100644 --- a/docs/source/user/elastodyn/theory.rst +++ b/docs/source/user/elastodyn/theory.rst @@ -172,51 +172,51 @@ When ``YawFrctMod`` = 1, the maximum static or dynamic Coulomb friction does not If :math:`\omega\neq0`, we have dynamic friction of the form .. math:: - M_f = -(\mu_d\bar{D})\times\text{sign}(\omega) - M_{f,vis}, + M_f = -(\mu_d\bar{D})\cdot\textrm{sign}(\omega) - M_{f,vis}, where :math:`\bar{D}` is the effective yaw-bearing diameter and :math:`\mu_d` is the dynamic Coulomb friction coefficient. Their product, :math:`\mu_d\bar{D}`, is specified in the input file through ``M_CD``. The first term on the right-hand side is the dynamic Coulomb friction. The viscous friction, :math:`M_{f,vis}`, is of the form .. math:: - M_{f,vis} = \sigma_v\omega + \sigma_{v2}\omega|\omega|\text{ if }|\omega|\ge\omega_c, + M_{f,vis} = \sigma_v\omega + \sigma_{v2}\omega\left|\omega\right|\qquad\qquad\text{if}~\left|\omega\right|\ge\omega_c, or .. math:: - M_{f,vis} = (\sigma_v + \sigma_{v2}\omega_c)\omega\text{ if }|\omega|\le\omega_c, + M_{f,vis} = (\sigma_v + \sigma_{v2}\omega_c)\omega\qquad\qquad\text{if}~\left|\omega\right|\le\omega_c, where :math:`\sigma_v` and :math:`\sigma_{v2}` are the linear and quadratic viscous friction coefficients and :math:`\omega_c` is the cutoff yaw rate below which viscous friction is linearized. Setting :math:`\omega_c=0` disables the linearization of viscous friction. If :math:`\omega=0` and :math:`\dot{\omega}\neq 0`, we have a slightly modified dynamic Coulomb friction of the form .. math:: - M_f = -\text{min}(\mu_d\bar{D},|M_z|)\times\text{sign}(M_z), + M_f = -\textrm{min}\!\left(\mu_d\bar{D},\left|M_z\right|\right)\cdot\textrm{sign}(M_z), where :math:`M_z` is the external yaw torque. If :math:`\omega=0` and :math:`\dot{\omega}=0`, we have static Coulomb friction of the form .. math:: - M_f = -\text{min}(\mu_s\bar{D},|M_z|)\times\text{sign}(M_z), + M_f = -\textrm{min}\!\left(\mu_s\bar{D},\left|M_z\right|\right)\cdot\textrm{sign}(M_z), where :math:`\mu_s` is the static Coulomb friction coefficient. The product :math:`\mu_s\bar{D}` is specified in the input file through ``M_CSmax``. -When ``YawFrctMod`` = 2, the maximum static or dynamic Coulomb friction depends on the external load on the yaw bearing, with proportional contributions from :math:`|F_z|`, the magnitude of the bearing axial load, if :math:`F_z<0`, from the bearing shear force magnitude, :math:`\sqrt{F_x^2+F_y^2}`, and from the bearing bending moment magnitude, :math:`\sqrt{M_x^2+M_y^2}`. +When ``YawFrctMod`` = 2, the maximum static or dynamic Coulomb friction depends on the external load on the yaw bearing, with proportional contributions from :math:`\left|F_z\right|`, the magnitude of the bearing axial load, if :math:`F_z<0`, from the bearing shear force magnitude, :math:`\sqrt{F_x^2+F_y^2}`, and from the bearing bending moment magnitude, :math:`\sqrt{M_x^2+M_y^2}`. If :math:`\omega\neq0`, we have dynamic friction of the form .. math:: - M_f = \left(\mu_d\bar{D}\text{min}(0,F_z)-\mu_{df}\bar{D}\sqrt{F_x^2+F_y^2}-\mu_{dm}\sqrt{M_x^2+M_y^2}\right)\times\text{sign}(\omega) - M_{f,vis}, + M_f = \left(\mu_d\bar{D}\cdot\textrm{min}\!\left(0,F_z\right)-\mu_{df}\bar{D}\sqrt{F_x^2+F_y^2}-\mu_{dm}\sqrt{M_x^2+M_y^2}\right)\cdot\textrm{sign}(\omega) - M_{f,vis}, where :math:`M_{f,vis}` is defined in the same way as when ``YawFrctMod`` = 1. The product :math:`\mu_{df}\bar{D}` and :math:`\mu_{dm}` are specified in the input file through ``M_FCD`` and ``M_MCD``, respectively. If :math:`\omega=0` and :math:`\dot{\omega}\neq 0`, we have a modified dynamic Coulomb friction of the form .. math:: - M_f = -\text{min}\left(\mu_d\bar{D}|\text{min}(0,F_z)| + \mu_{df}\bar{D}\sqrt{F_x^2+F_y^2} + \mu_{dm}\sqrt{M_x^2+M_y^2},|M_z|\right)\times\text{sign}(M_z). + M_f = -\textrm{min}\!\left(\mu_d\bar{D}\left|\textrm{min}(0,F_z)\right| + \mu_{df}\bar{D}\sqrt{F_x^2+F_y^2} + \mu_{dm}\sqrt{M_x^2+M_y^2},\left|M_z\right|\right)\cdot\textrm{sign}(M_z). If :math:`\omega=0` and :math:`\dot{\omega}=0`, we have static Coulomb friction of the form .. math:: - M_f = -\text{min}\left(\mu_s\bar{D}|\text{min}(0,F_z)| + \mu_{sf}\bar{D}\sqrt{F_x^2+F_y^2} + \mu_{sm}\sqrt{M_x^2+M_y^2},|M_z|\right)\times\text{sign}(M_z), + M_f = -\textrm{min}\!\left(\mu_s\bar{D}\left|\textrm{min}(0,F_z)\right| + \mu_{sf}\bar{D}\sqrt{F_x^2+F_y^2} + \mu_{sm}\sqrt{M_x^2+M_y^2},\left|M_z\right|\right)\cdot\textrm{sign}(M_z), where the product :math:`\mu_{sf}\bar{D}` and :math:`\mu_{sm}` are specified in the input file through ``M_FCSmax`` and ``M_MCSmax``, respectively.