diff --git a/docs/source/user/elastodyn/figs/YawFrictionModel.jpg b/docs/source/user/elastodyn/figs/YawFrictionModel.jpg index aa39021ee7..4a89c6ca0a 100644 Binary files a/docs/source/user/elastodyn/figs/YawFrictionModel.jpg and b/docs/source/user/elastodyn/figs/YawFrictionModel.jpg differ diff --git a/docs/source/user/elastodyn/input.rst b/docs/source/user/elastodyn/input.rst index ff46640093..c6a7c3b264 100644 --- a/docs/source/user/elastodyn/input.rst +++ b/docs/source/user/elastodyn/input.rst @@ -238,13 +238,25 @@ Rotor-Teeter Yaw-Friction ~~~~~~~~~~~~ -**YawFrctMod** - Yaw-friction model {0: none, 1: friction without Fz term at the yaw bearing, 2: friction includes Fz term at yaw bearing, 3: user defined model} +**YawFrctMod** - Yaw-friction model {0: none, 1: friction independent of yaw-bearing force and bending moment, 2: friction with Coulomb terms depending on yaw-bearing force and bending moment, 3: user defined model} -**M_CSmax** - Maximum Coulomb friction torque (N-m)[mu_s*D_eff when YawFrctMod=1 and Fz*mu_s*D_eff when YawFrctMod=2] +**M_CSmax** - Maximum static Coulomb friction torque (N-m) [M_CSmax when YawFrctMod=1; -min(0,Fz)*M_CSmax when YawFrctMod=2] -**M_CD** - Dynamic friction moment at null yaw rate (N-m) [mu_d*D_eff when YawFrctMod=1 and Fz*mu_d*D_eff when YawFrctMod=2] +**M_FCSmax** - Maximum static Coulomb friction torque proportional to yaw bearing shear force (N-m) [sqrt(Fx^2+Fy^2)*M_FCSmax; only used when YawFrctMod=2] -**sig_v** - Viscous friction coefficient (N-m/(rad/s)) +**M_MCSmax** - Maximum static Coulomb friction torque proportional to yaw bearing bending moment (N-m) [sqrt(Mx^2+My^2)*M_MCSmax; only used when YawFrctMod=2] + +**M_CD** - Dynamic Coulomb friction moment (N-m) [M_CD when YawFrctMod=1; -min(0,Fz)*M_CD when YawFrctMod=2] + +**M_FCD** - Dynamic Coulomb friction moment proportional to yaw bearing shear force (N-m) [sqrt(Fx^2+Fy^2)*M_FCD; only used when YawFrctMod=2] + +**M_MCD** - Dynamic Coulomb friction moment proportional to yaw bearing bending moment (N-m) [sqrt(Mx^2+My^2)*M_MCD; only used when YawFrctMod=2] + +**sig_v** - Linear viscous friction coefficient (N-m/(rad/s)) + +**sig_v2** - Quadratic viscous friction coefficient (N-m/(rad/s)^2) + +**OmgCut** - Yaw angular velocity cutoff below which viscous friction is linearized (rad/s) Drivetrain diff --git a/docs/source/user/elastodyn/theory.rst b/docs/source/user/elastodyn/theory.rst index 3474835f05..d4756dd0cd 100644 --- a/docs/source/user/elastodyn/theory.rst +++ b/docs/source/user/elastodyn/theory.rst @@ -153,16 +153,12 @@ The total moment on the given degree of freedom is: .. math:: :label: TFTotTorque Q = Q_\text{lin} + Q_\text{stop,spr} + Q_\text{stop,dmp} - - - - .. _ed_yawfriction_theory: -Yaw-friction ------------- +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` @@ -172,29 +168,62 @@ The yaw-friction moment as a function of yaw rate (:math:`\omega`) is shown belo Yaw-friction model -The yaw-friction torque :math:`M_f` can be calcualated 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:: + 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\left|\omega\right|\qquad\qquad\text{if}~\left|\omega\right|\ge\omega_c, -if :math:`\omega\neq0`: +or .. math:: - M_f = \mu_d\bar{D}\times\text{min}(0,F_z)\times\text{sign}(\omega) - \sigma_v\times\omega - -if :math:`\omega=0` and :math:`\dot{\omega}\neq 0`: + 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 = \mu_d\bar{D}\times\text{min}(0,F_z)\times\text{sign}(\dot{\omega}) + M_f = -\textrm{min}\!\left(\mu_d\bar{D},\left|M_z\right|\right)\cdot\textrm{sign}(M_z), -if :math:`\omega=0` and :math:`\dot{\omega}=0`: +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}\times|\text{min}(0,F_z)|,|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``. -where :math:`\bar{D}` is the effective yaw-bearing race diameter, :math:`\mu_d` is the dynamic friction coefficient, :math:`\mu_s` is the static friction coefficient, :math:`F_z` is effective axial load on yaw-bearing, :math:`M-z` is the external torque on yaw-bearing. -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, (sign(0) is taken as 1). -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 ``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}\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 = -\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 = -\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. + +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. .. _ed_dev_notes: diff --git a/modules/elastodyn/src/ED_UserSubs.f90 b/modules/elastodyn/src/ED_UserSubs.f90 index 47e2abd8fd..42372a4288 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(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 297db86846..cbfdace5c6 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,17 @@ 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 + p%OmgCut = InputFileData%OmgCut CALL AllocAry( p%TipMass, p%NumBl, 'TipMass', ErrStat, ErrMsg ) @@ -6403,58 +6409,64 @@ 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(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). + 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, Mf_vis ! temp 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! - YawFriMf = 0.0_ReKi + CASE ( 1_IntKi, 2_IntKi ) ! 1 = F and M not used. 2 = F and M used - CASE ( 1_IntKi, 2_IntKi ) ! 1= no Fz use. 2=Fz 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_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 - 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( Omg, 0.0_R8Ki )) THEN 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) + ! 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 - 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 - RETURN END SUBROUTINE YawFriction !---------------------------------------------------------------------------------------------------------------------------------- diff --git a/modules/elastodyn/src/ElastoDyn_IO.f90 b/modules/elastodyn/src/ElastoDyn_IO.f90 index 23054a48c1..5e32e39bd5 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,45 @@ 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 + + ! 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 ) @@ -4331,9 +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_CSmax < 0_R8Ki ) CALL SetErrStat( ErrID_Fatal, 'M_CSmax 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%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 ) + + ! 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 diff --git a/modules/elastodyn/src/ElastoDyn_Registry.txt b/modules/elastodyn/src/ElastoDyn_Registry.txt index 0ffcb4130a..2210e9b573 100644 --- a/modules/elastodyn/src/ElastoDyn_Registry.txt +++ b/modules/elastodyn/src/ElastoDyn_Registry.txt @@ -169,8 +169,14 @@ 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 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 @@ -543,7 +549,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 +788,14 @@ 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 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 diff --git a/modules/elastodyn/src/ElastoDyn_Types.f90 b/modules/elastodyn/src/ElastoDyn_Types.f90 index db494845e8..adc0c3f8c8 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) diff --git a/reg_tests/r-test b/reg_tests/r-test index 16f4217799..b3824f2d3a 160000 --- a/reg_tests/r-test +++ b/reg_tests/r-test @@ -1 +1 @@ -Subproject commit 16f42177996ce19556d7848b72a123764a6c7297 +Subproject commit b3824f2d3a4cd4cb826aa4ac95b6e39a99e66d43