diff --git a/docs/source/user/elastodyn/input.rst b/docs/source/user/elastodyn/input.rst index a9f2fec2de..ff46640093 100644 --- a/docs/source/user/elastodyn/input.rst +++ b/docs/source/user/elastodyn/input.rst @@ -199,7 +199,11 @@ Mass and Inertia **PtfmYIner** - Platform inertia for yaw rotation about the platform CM (kg m^2) +**PtfmXYIner** - Platform roll-pitch moment of inertia (*Ixy=-∫xydm*) about the platform CM (kg m^2) +**PtfmYZIner** - Platform pitch-yaw moment of inertia (*Iyz=-∫yzdm*) about the platform CM (kg m^2) + +**PtfmXZIner** - Platform roll-yaw moment of inertia (*Ixz=-∫xzdm*) about the platform CM (kg m^2) Blade ~~~~~ diff --git a/modules/elastodyn/src/ElastoDyn.f90 b/modules/elastodyn/src/ElastoDyn.f90 index 2b4625b3cd..5f968bd292 100644 --- a/modules/elastodyn/src/ElastoDyn.f90 +++ b/modules/elastodyn/src/ElastoDyn.f90 @@ -3521,6 +3521,9 @@ SUBROUTINE SetPrimaryParameters( InitInp, p, InputFileData, ErrStat, ErrMsg ) p%PtfmRIner = InputFileData%PtfmRIner p%PtfmPIner = InputFileData%PtfmPIner p%PtfmYIner = InputFileData%PtfmYIner + p%PtfmXYIner = InputFileData%PtfmXYIner + p%PtfmYZIner = InputFileData%PtfmYZIner + p%PtfmXZIner = InputFileData%PtfmXZIner p%GBoxEff = InputFileData%GBoxEff p%GBRatio = InputFileData%GBRatio p%DTTorSpr = InputFileData%DTTorSpr @@ -8191,7 +8194,13 @@ SUBROUTINE CalculateForcesMoments( p, x, CoordSys, u, RtHSdat ) RtHSdat%PMomXAll(:,p%DOFs%PYE(I)) = RtHSdat%PMomXAll(:,p%DOFs%PYE(I) ) + RtHSdat%PMXHydro(p%DOFs%PYE(I),:) + TmpVec2 & - p%PtfmRIner*CoordSys%a1*DOT_PRODUCT( CoordSys%a1, RtHSdat%PAngVelEX(p%DOFs%PYE(I),0,:) ) & - p%PtfmYIner*CoordSys%a2*DOT_PRODUCT( CoordSys%a2, RtHSdat%PAngVelEX(p%DOFs%PYE(I),0,:) ) & - - p%PtfmPIner*CoordSys%a3*DOT_PRODUCT( CoordSys%a3, RtHSdat%PAngVelEX(p%DOFs%PYE(I),0,:) ) + - p%PtfmPIner*CoordSys%a3*DOT_PRODUCT( CoordSys%a3, RtHSdat%PAngVelEX(p%DOFs%PYE(I),0,:) ) & + - p%PtfmXZIner*CoordSys%a1*DOT_PRODUCT( CoordSys%a2, RtHSdat%PAngVelEX(p%DOFs%PYE(I),0,:) ) & + + p%PtfmXYIner*CoordSys%a1*DOT_PRODUCT( CoordSys%a3, RtHSdat%PAngVelEX(p%DOFs%PYE(I),0,:) ) & + + p%PtfmYZIner*CoordSys%a2*DOT_PRODUCT( CoordSys%a3, RtHSdat%PAngVelEX(p%DOFs%PYE(I),0,:) ) & + - p%PtfmXZIner*CoordSys%a2*DOT_PRODUCT( CoordSys%a1, RtHSdat%PAngVelEX(p%DOFs%PYE(I),0,:) ) & + + p%PtfmXYIner*CoordSys%a3*DOT_PRODUCT( CoordSys%a1, RtHSdat%PAngVelEX(p%DOFs%PYE(I),0,:) ) & + + p%PtfmYZIner*CoordSys%a3*DOT_PRODUCT( CoordSys%a2, RtHSdat%PAngVelEX(p%DOFs%PYE(I),0,:) ) ENDDO ! I - All active (enabled) DOFs that contribute to the QD2T-related linear accelerations of the platform center of mass (point Y) @@ -8205,7 +8214,14 @@ SUBROUTINE CalculateForcesMoments( p, x, CoordSys, u, RtHSdat ) TmpVec3 = CROSS_PRODUCT( RtHSdat%rZT0 , RtHSdat%FrcT0Trbt ) ! The portion of MomXAllt associated with the FrcT0Trbt TmpVec = p%PtfmRIner*CoordSys%a1*DOT_PRODUCT( CoordSys%a1, RtHSdat%AngVelEX ) & ! = ( Platform inertia dyadic ) dot ( angular velocity of platform in the inertia frame ) + p%PtfmYIner*CoordSys%a2*DOT_PRODUCT( CoordSys%a2, RtHSdat%AngVelEX ) & - + p%PtfmPIner*CoordSys%a3*DOT_PRODUCT( CoordSys%a3, RtHSdat%AngVelEX ) + + p%PtfmPIner*CoordSys%a3*DOT_PRODUCT( CoordSys%a3, RtHSdat%AngVelEX ) & + + p%PtfmXZIner*CoordSys%a1*DOT_PRODUCT( CoordSys%a2, RtHSdat%AngVelEX ) & + - p%PtfmXYIner*CoordSys%a1*DOT_PRODUCT( CoordSys%a3, RtHSdat%AngVelEX ) & + - p%PtfmYZIner*CoordSys%a2*DOT_PRODUCT( CoordSys%a3, RtHSdat%AngVelEX ) & + + p%PtfmXZIner*CoordSys%a2*DOT_PRODUCT( CoordSys%a1, RtHSdat%AngVelEX ) & + - p%PtfmXYIner*CoordSys%a3*DOT_PRODUCT( CoordSys%a1, RtHSdat%AngVelEX ) & + - p%PtfmYZIner*CoordSys%a3*DOT_PRODUCT( CoordSys%a2, RtHSdat%AngVelEX ) + TmpVec4 = CROSS_PRODUCT( -RtHSdat%AngVelEX, TmpVec ) ! = ( -angular velocity of platform in the inertia frame ) cross ( TmpVec ) RtHSdat%FrcZAllt = RtHSdat%FrcT0Trbt + RtHSdat%FZHydrot + TmpVec1 diff --git a/modules/elastodyn/src/ElastoDyn_IO.f90 b/modules/elastodyn/src/ElastoDyn_IO.f90 index 5a92da55b8..887700b85b 100644 --- a/modules/elastodyn/src/ElastoDyn_IO.f90 +++ b/modules/elastodyn/src/ElastoDyn_IO.f90 @@ -3416,6 +3416,30 @@ SUBROUTINE ReadPrimaryFile( InputFile, InputFileData, BldFile, FurlFile, TwrFile RETURN END IF + ! PtfmXYIner - Platform xy inertia about the platform CM (kg m^2): + CALL ReadVar( UnIn, InputFile, InputFileData%PtfmXYIner, "PtfmXYIner", "Platform xy inertia about the platform CM (kg m^2)", ErrStat2, ErrMsg2, UnEc) + CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + IF ( ErrStat >= AbortErrLev ) THEN + CALL Cleanup() + RETURN + END IF + + ! PtfmYZIner - Platform yz inertia about the platform CM (kg m^2): + CALL ReadVar( UnIn, InputFile, InputFileData%PtfmYZIner, "PtfmYZIner", "Platform yz inertia about the platform CM (kg m^2)", ErrStat2, ErrMsg2, UnEc) + CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + IF ( ErrStat >= AbortErrLev ) THEN + CALL Cleanup() + RETURN + END IF + + ! PtfmXZIner - Platform xz inertia about the platform CM (kg m^2): + CALL ReadVar( UnIn, InputFile, InputFileData%PtfmXZIner, "PtfmXZIner", "Platform xz inertia about the platform CM (kg m^2)", ErrStat2, ErrMsg2, UnEc) + CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) + IF ( ErrStat >= AbortErrLev ) THEN + CALL Cleanup() + RETURN + END IF + !---------------------- BLADE --------------------------------------------------- CALL ReadCom( UnIn, InputFile, 'Section Header: Blade', ErrStat2, ErrMsg2, UnEc ) CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName ) diff --git a/modules/elastodyn/src/ElastoDyn_Registry.txt b/modules/elastodyn/src/ElastoDyn_Registry.txt index 1381c8e383..2b4faccfc0 100644 --- a/modules/elastodyn/src/ElastoDyn_Registry.txt +++ b/modules/elastodyn/src/ElastoDyn_Registry.txt @@ -153,6 +153,9 @@ typedef ^ ED_InputFile ReKi PtfmMass - - - "Platform mass" kg typedef ^ ED_InputFile ReKi PtfmRIner - - - "Platform inertia for roll tilt rotation about the platform CM" "kg m^2" typedef ^ ED_InputFile ReKi PtfmPIner - - - "Platform inertia for pitch tilt rotation about the platform CM" "kg m^2" typedef ^ ED_InputFile ReKi PtfmYIner - - - "Platform inertia for yaw rotation about the platform CM" "kg m^2" +typedef ^ ED_InputFile ReKi PtfmXYIner - - - "Platform xy inertia about the platform CM" "kg m^2" +typedef ^ ED_InputFile ReKi PtfmYZIner - - - "Platform yz inertia about the platform CM" "kg m^2" +typedef ^ ED_InputFile ReKi PtfmXZIner - - - "Platform xz inertia about the platform CM" "kg m^2" typedef ^ ED_InputFile ReKi BldNodes - - - "Number of blade nodes (per blade) used for analysis" - typedef ^ ED_InputFile ED_BladeMeshInputData InpBlMesh {:} - - "Input data for blade discretizations (could be on each blade)" "see BladeMeshInputData" typedef ^ ED_InputFile BladeInputData InpBl {:} - - "Input data for individual blades" "see BladeInputData type" @@ -672,6 +675,9 @@ typedef ^ ParameterType ReKi PtfmMass - - - "Platform mass" typedef ^ ParameterType ReKi PtfmPIner - - - "Platform inertia for pitch tilt rotation about the platform CM." typedef ^ ParameterType ReKi PtfmRIner - - - "Platform inertia for roll tilt rotation about the platform CM." typedef ^ ParameterType ReKi PtfmYIner - - - "Platform inertia for yaw rotation about the platform CM." +typedef ^ ParameterType ReKi PtfmXYIner - - - "Platform xy inertia about the platform CM" "kg m^2" +typedef ^ ParameterType ReKi PtfmYZIner - - - "Platform yz inertia about the platform CM" "kg m^2" +typedef ^ ParameterType ReKi PtfmXZIner - - - "Platform xz inertia about the platform CM" "kg m^2" typedef ^ ParameterType ReKi RFrlMass - - - "Rotor-furl mass" typedef ^ ParameterType ReKi RotIner - - - "Inertia of rotor about its centerline" typedef ^ ParameterType ReKi RotMass - - - "Rotor mass (blades, tips, and hub)" diff --git a/modules/elastodyn/src/ElastoDyn_Types.f90 b/modules/elastodyn/src/ElastoDyn_Types.f90 index 72c3f10730..08bd6d5615 100644 --- a/modules/elastodyn/src/ElastoDyn_Types.f90 +++ b/modules/elastodyn/src/ElastoDyn_Types.f90 @@ -175,6 +175,9 @@ MODULE ElastoDyn_Types REAL(ReKi) :: PtfmRIner = 0.0_ReKi !< Platform inertia for roll tilt rotation about the platform CM [kg m^2] REAL(ReKi) :: PtfmPIner = 0.0_ReKi !< Platform inertia for pitch tilt rotation about the platform CM [kg m^2] REAL(ReKi) :: PtfmYIner = 0.0_ReKi !< Platform inertia for yaw rotation about the platform CM [kg m^2] + REAL(ReKi) :: PtfmXYIner = 0.0_ReKi !< Platform xy inertia about the platform CM [kg m^2] + REAL(ReKi) :: PtfmYZIner = 0.0_ReKi !< Platform yz inertia for pitch tilt rotation about the platform CM [kg m^2] + REAL(ReKi) :: PtfmXZIner = 0.0_ReKi !< Platform xz inertia for yaw rotation about the platform CM [kg m^2] REAL(ReKi) :: BldNodes = 0.0_ReKi !< Number of blade nodes (per blade) used for analysis [-] TYPE(ED_BladeMeshInputData) , DIMENSION(:), ALLOCATABLE :: InpBlMesh !< Input data for blade discretizations (could be on each blade) [see BladeMeshInputData] TYPE(BladeInputData) , DIMENSION(:), ALLOCATABLE :: InpBl !< Input data for individual blades [see BladeInputData type] @@ -688,6 +691,9 @@ MODULE ElastoDyn_Types REAL(ReKi) :: PtfmPIner = 0.0_ReKi !< Platform inertia for pitch tilt rotation about the platform CM. [-] REAL(ReKi) :: PtfmRIner = 0.0_ReKi !< Platform inertia for roll tilt rotation about the platform CM. [-] REAL(ReKi) :: PtfmYIner = 0.0_ReKi !< Platform inertia for yaw rotation about the platform CM. [-] + REAL(ReKi) :: PtfmXYIner = 0.0_ReKi !< Platform xy inertia about the platform CM [kg m^2] + REAL(ReKi) :: PtfmYZIner = 0.0_ReKi !< Platform yz inertia for pitch tilt rotation about the platform CM [kg m^2] + REAL(ReKi) :: PtfmXZIner = 0.0_ReKi !< Platform xz inertia for yaw rotation about the platform CM [kg m^2] REAL(ReKi) :: RFrlMass = 0.0_ReKi !< Rotor-furl mass [-] REAL(ReKi) :: RotIner = 0.0_ReKi !< Inertia of rotor about its centerline [-] REAL(ReKi) :: RotMass = 0.0_ReKi !< Rotor mass (blades, tips, and hub) [-] @@ -1655,6 +1661,9 @@ subroutine ED_CopyInputFile(SrcInputFileData, DstInputFileData, CtrlCode, ErrSta DstInputFileData%PtfmRIner = SrcInputFileData%PtfmRIner DstInputFileData%PtfmPIner = SrcInputFileData%PtfmPIner DstInputFileData%PtfmYIner = SrcInputFileData%PtfmYIner + DstInputFileData%PtfmXYIner = SrcInputFileData%PtfmXYIner + DstInputFileData%PtfmYZIner = SrcInputFileData%PtfmYZIner + DstInputFileData%PtfmXZIner = SrcInputFileData%PtfmXZIner DstInputFileData%BldNodes = SrcInputFileData%BldNodes if (allocated(SrcInputFileData%InpBlMesh)) then LB(1:1) = lbound(SrcInputFileData%InpBlMesh, kind=B8Ki) @@ -2035,6 +2044,9 @@ subroutine ED_PackInputFile(RF, Indata) call RegPack(RF, InData%PtfmRIner) call RegPack(RF, InData%PtfmPIner) call RegPack(RF, InData%PtfmYIner) + call RegPack(RF, InData%PtfmXYIner) + call RegPack(RF, InData%PtfmYZIner) + call RegPack(RF, InData%PtfmXZIner) call RegPack(RF, InData%BldNodes) call RegPack(RF, allocated(InData%InpBlMesh)) if (allocated(InData%InpBlMesh)) then @@ -2224,6 +2236,9 @@ subroutine ED_UnPackInputFile(RF, OutData) call RegUnpack(RF, OutData%PtfmRIner); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%PtfmPIner); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%PtfmYIner); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%PtfmXYIner); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%PtfmYZIner); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%PtfmXZIner); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%BldNodes); if (RegCheckErr(RF, RoutineName)) return if (allocated(OutData%InpBlMesh)) deallocate(OutData%InpBlMesh) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return @@ -5478,6 +5493,9 @@ subroutine ED_CopyParam(SrcParamData, DstParamData, CtrlCode, ErrStat, ErrMsg) DstParamData%PtfmPIner = SrcParamData%PtfmPIner DstParamData%PtfmRIner = SrcParamData%PtfmRIner DstParamData%PtfmYIner = SrcParamData%PtfmYIner + DstParamData%PtfmXYIner = SrcParamData%PtfmXYIner + DstParamData%PtfmYZIner = SrcParamData%PtfmYZIner + DstParamData%PtfmXZIner = SrcParamData%PtfmXZIner DstParamData%RFrlMass = SrcParamData%RFrlMass DstParamData%RotIner = SrcParamData%RotIner DstParamData%RotMass = SrcParamData%RotMass @@ -6356,6 +6374,9 @@ subroutine ED_PackParam(RF, Indata) call RegPack(RF, InData%PtfmPIner) call RegPack(RF, InData%PtfmRIner) call RegPack(RF, InData%PtfmYIner) + call RegPack(RF, InData%PtfmXYIner) + call RegPack(RF, InData%PtfmYZIner) + call RegPack(RF, InData%PtfmXZIner) call RegPack(RF, InData%RFrlMass) call RegPack(RF, InData%RotIner) call RegPack(RF, InData%RotMass) @@ -6618,6 +6639,9 @@ subroutine ED_UnPackParam(RF, OutData) call RegUnpack(RF, OutData%PtfmPIner); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%PtfmRIner); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%PtfmYIner); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%PtfmXYIner); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%PtfmYZIner); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%PtfmXZIner); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%RFrlMass); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%RotIner); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%RotMass); if (RegCheckErr(RF, RoutineName)) return diff --git a/reg_tests/r-test b/reg_tests/r-test index 4d17325af0..807b2a510f 160000 --- a/reg_tests/r-test +++ b/reg_tests/r-test @@ -1 +1 @@ -Subproject commit 4d17325af0913132fdfe92c15f3ea00669b50d12 +Subproject commit 807b2a510f606ed20782e8915ab62984b234a884