diff --git a/docs/OtherSupporting/OutListParameters.xlsx b/docs/OtherSupporting/OutListParameters.xlsx index 2ece7d48db..20c6204683 100644 Binary files a/docs/OtherSupporting/OutListParameters.xlsx and b/docs/OtherSupporting/OutListParameters.xlsx differ diff --git a/docs/source/user/aerodyn-aeroacoustics/example/AeroDyn.ipt b/docs/source/user/aerodyn-aeroacoustics/example/AeroDyn.ipt index 57c3752e01..a7a30ffc94 100644 --- a/docs/source/user/aerodyn-aeroacoustics/example/AeroDyn.ipt +++ b/docs/source/user/aerodyn-aeroacoustics/example/AeroDyn.ipt @@ -11,6 +11,7 @@ False TwrAero - Calculate tower aerodynamic loads? (flag) False FrozenWake - Assume frozen wake during linearization? (flag False CavitCheck - Perform cavitation check? (flag) False Buoyancy - Include buoyancy effects? (flag) +False NacelleDrag - Include Nacelle Drag effects? (flag) True CompAA - Flag to compute AeroAcoustics calculation "AeroAcousticsInput.dat" AA_InputFile ====== Environmental Conditions ========================================== diff --git a/docs/source/user/aerodyn/appendix.rst b/docs/source/user/aerodyn/appendix.rst index 0f60e7cf7d..ef7a0fbd09 100644 --- a/docs/source/user/aerodyn/appendix.rst +++ b/docs/source/user/aerodyn/appendix.rst @@ -27,7 +27,7 @@ outside of OpenFAST. 3) AeroDyn Primary Input File :download:`(primary input file example) `: -The primary AeroDyn input file defines modeling options, environmental conditions (except freestream flow), airfoils, tower nodal discretization and properties, tower, hub, and nacelle buoyancy properties, as well as output file specifications. +The primary AeroDyn input file defines modeling options, environmental conditions (except freestream flow), airfoils, tower nodal discretization and properties, tower, hub, and nacelle properties, as well as output file specifications. The file is organized into several functional sections. Each section corresponds to an aspect of the aerodynamics model. diff --git a/docs/source/user/aerodyn/driver.rst b/docs/source/user/aerodyn/driver.rst index 86469839f3..dec9b71aa3 100644 --- a/docs/source/user/aerodyn/driver.rst +++ b/docs/source/user/aerodyn/driver.rst @@ -375,24 +375,30 @@ An example is given below for two turbines, the first one having 3 blades, the s **Hub and nacelle inputs** -The sections defining the hub and nacelle buoyancy parameters must also be reproduced for each turbine. +The sections defining the hub and nacelle parameters must also be reproduced for each turbine. An example is given below for two turbines: .. code:: ====== Hub Properties ============================================================================== [used only when Buoyancy=True] - 7.0 VolHub - Hub volume (m^3) - 0.0 HubCenBx - Hub center of buoyancy x direction offset (m) + 7.0 VolHub - Hub volume (m^3) + 0.0 HubCenBx - Hub center of buoyancy x direction offset (m) ====== Hub Properties ============================================================================== [used only when Buoyancy=True] - 5.0 VolHub - Hub volume (m^3) - 0.2 HubCenBx - Hub center of buoyancy x direction offset (m) - ====== Nacelle Properties ========================================================================== [used only when Buoyancy=True] - 32.0 VolNac - Nacelle volume (m^3) - 0.3, 0.0, 0.05 NacCenB - Position of nacelle center of buoyancy from yaw bearing in nacelle coordinates (m) - ====== Nacelle Properties ========================================================================== [used only when Buoyancy=True] - 30.0 VolNac - Nacelle volume (m^3) - 0.5, 0.1, 0.05 NacCenB - Position of nacelle center of buoyancy from yaw bearing in nacelle coordinates (m) + 5.0 VolHub - Hub volume (m^3) + 0.2 HubCenBx - Hub center of buoyancy x direction offset (m) + ====== Nacelle Properties ========================================================================== [used only when Buoyancy=True or NacelleDrag=True] + 32.0 VolNac - Nacelle volume (m^3) + 0.3, 0.0, 0.05 NacCenB - Position of nacelle center of buoyancy from yaw bearing in nacelle coordinates (m) + 4.67, 20.15, 20.15 NacArea - Projected area of the nacelle in X, Y, Z in the nacelle coordinate system (m^2) + 0.5, 0.5, 0.5 NacCd - Drag coefficient for the nacelle areas defined above (-) + 0.43, 0, 0 NacDragAC - Position of aerodynamic center of nacelle drag in nacelle coordinates (m) + ====== Nacelle Properties ========================================================================== [used only when Buoyancy=True or NacelleDrag=True] + 32.0 VolNac - Nacelle volume (m^3) + 0.3, 0.0, 0.05 NacCenB - Position of nacelle center of buoyancy from yaw bearing in nacelle coordinates (m) + 4.67, 20.15, 20.15 NacArea - Projected area of the nacelle in X, Y, Z in the nacelle coordinate system (m^2) + 0.5, 0.5, 0.5 NacCd - Drag coefficient for the nacelle areas defined above (-) + 0.43, 0, 0 NacDragAC - Position of aerodynamic center of nacelle drag in nacelle coordinates (m) **Aerodynamic tower inputs** diff --git a/docs/source/user/aerodyn/examples/ad_primary_example.dat b/docs/source/user/aerodyn/examples/ad_primary_example.dat index b0c4dec21f..1586aa3e5a 100644 --- a/docs/source/user/aerodyn/examples/ad_primary_example.dat +++ b/docs/source/user/aerodyn/examples/ad_primary_example.dat @@ -9,6 +9,7 @@ False Echo - Echo the input to ".AD.ech"? (flag False TwrAero - Calculate tower aerodynamic loads? (flag) False CavitCheck - Perform cavitation check? (flag) [UA_Mod must be 0 when CavitCheck=true] False Buoyancy - Include buoyancy effects? (flag) +False NacelleDrag - Include Nacelle Drag effects? (flag) False CompAA - Flag to compute AeroAcoustics calculation [used only when Wake_Mod = 1 or 2] "unused" AA_InputFile - AeroAcoustics input file [used only when CompAA=true] ====== Environmental Conditions =================================================================== @@ -75,9 +76,12 @@ True UseBlCm - Include aerodynamic pitching moment in calcul ====== Hub Properties ============================================================================== [used only when Buoyancy=True] 0 VolHub - Hub volume (m^3) 0 HubCenBx - Hub center of buoyancy x direction offset (m) -====== Nacelle Properties ========================================================================== [used only when Buoyancy=True] +====== Nacelle Properties ========================================================================== [used only when Buoyancy=True or NacelleDrag=True] 0 VolNac - Nacelle volume (m^3) - 0, 0, 0 NacCenB - Position of nacelle center of buoyancy from yaw bearing in nacelle coordinates (m) + 0, 0, 0 NacCenB - Position of nacelle center of buoyancy from yaw bearing in nacelle coordinates (m) + 0, 0, 0 NacArea - Projected area of the nacelle in X, Y, Z in the nacelle coordinate system (m^2) + 0, 0, 0 NacCd - Drag coefficient for the nacelle areas defined above (-) + 0, 0, 0 NacDragAC - Position of aerodynamic center of nacelle drag in nacelle coordinates (m) ====== Tail Fin Aerodynamics ======================================================================= False TFinAero - Calculate tail fin aerodynamics model (flag) "unused" TFinFile - Input file for tail fin aerodynamics [used only when TFinAero=True] diff --git a/docs/source/user/aerodyn/input.rst b/docs/source/user/aerodyn/input.rst index a9a6218cdc..b901a541f4 100644 --- a/docs/source/user/aerodyn/input.rst +++ b/docs/source/user/aerodyn/input.rst @@ -45,7 +45,7 @@ AeroDyn Primary Input File The primary AeroDyn input file defines modeling options, environmental conditions (except freestream flow), airfoils, tower nodal -discretization and properties, tower, hub, and nacelle buoyancy properties, +discretization and properties, tower, hub, and nacelle properties, as well as output file specifications. The file is organized into several functional sections. Each section @@ -134,6 +134,9 @@ tower, nacelle, and hub of an MHK turbine or FALSE to disable this calculation. If ``Buoyancy`` is TRUE, the ``MHK`` flag in the AeroDyn or OpenFAST driver input file must be set to 1 or 2 to indicate an MHK turbine is being modeled. +Set the ``NacelleDrag`` flag to TRUE to calculate the drag loads on the nacelle +or FALSE to disable this calculation. + Set the ``CompAA`` flag to TRUE to run aero-acoustic calculations. This option is only available for ``Wake_Mod = 1`` and is not available for an MHK turbine. See section :numref:`AeroAcoustics` for information on how to @@ -451,13 +454,18 @@ Since the hub and blades are joined elements, hub buoyancy should be turned on i Nacelle Properties ~~~~~~~~~~~~~~~~~~ -The input parameters in this section pertain to the calculation of buoyant loads -on the nacelle and are only used when ``Buoyancy = TRUE``. +The input parameters in this section pertain to the calculation of buoyant and drag loads +on the nacelle and are only used when ``Buoyancy = TRUE`` or ``NacelleDrag = TRUE``. ``VolNac`` is the volume of the nacelle and ``NacCenB``` is the position (x,y,z vector) of the nacelle center of buoyancy from the yaw bearing in local nacelle coordinates. To neglect buoyant -loads on the nacelle, set ``VolNac`` to 0. +loads on the nacelle, set ``VolNac`` to 0. Only used when ``Buoyancy = TRUE``. + +``NacArea`` are the projected areas (Ax,Ay,Az vector) of the nacelle in the nacelle coordinate system, +``NacCd`` are the drag coefficients (Cdx, Cdy, Cdz vector) for the three nacelle areas defined by ``NacArea``and ``NacDragAC`` is the +position (x,y,z vector) of the nacelle aerodynamic center from +the yaw bearing in local nacelle coordinates. Only used when ``NacelleDrag = TRUE``. Tail fin AeroDynamics ~~~~~~~~~~~~~~~~~~~~~ diff --git a/docs/source/user/aerodyn/introduction.rst b/docs/source/user/aerodyn/introduction.rst index c743fc2875..d4f845f374 100644 --- a/docs/source/user/aerodyn/introduction.rst +++ b/docs/source/user/aerodyn/introduction.rst @@ -69,7 +69,7 @@ driver code, without aero-elastic coupling. AeroDyn consists of six submodels: (1) rotor wake/induction, (2) blade airfoil aerodynamics, (3) tower influence on the fluid local to the -blade nodes, (4) tower drag, (5) aeroacoustics, +blade nodes, (4) tower and nacelle drag, (5) aeroacoustics, and (6) buoyancy on the blades, hub, nacelle, and tower (for MHK turbines). Nacelle, hub, and tail-vane fluid influence and loading (with the exception of nacelle and hub buoyant loads) and wake and array effects between @@ -179,9 +179,15 @@ structural motion, depending on features enabled). The tower drag load calculation is quasi-steady and independent from the tower influence on flow models. +Similarly, the aerodynamics drag loads on the nacelle is calculated using the +nacelle geometry, drag coefficients, and the local relative fluid +velocity between the freestream (undisturbed) flow and nacelle. The +nacelle drag load calculation is quasi-steady and independent from the +rotors influence on flow models. + The primary AeroDyn input file defines modeling options, environmental conditions (except freestream flow), airfoils, tower nodal -discretization and properties, tower, hub, and nacelle buoyancy properties, +discretization and properties, tower, hub, and nacelle properties, as well as output file specifications. Airfoil data properties are read from dedicated inputs files (one for each airfoil) and include coefficients of lift force, drag force, and optional pitching moment and minimum pressure diff --git a/docs/source/user/api_change.rst b/docs/source/user/api_change.rst index 03ebb96eb5..c32d5e60bf 100644 --- a/docs/source/user/api_change.rst +++ b/docs/source/user/api_change.rst @@ -42,6 +42,9 @@ FAST.Farm 75 WAT_DxDyDz 5.0, FAST.Farm 76 WAT_ScaleBox default WAT_ScaleBox - Flag to scale the input turbulence box to zero mean and unit standard deviation at every node [DEFAULT=False] (flag) FAST.Farm 77 WAT_k_Def default WAT_k_Def - Calibrated parameters for the influence of the maximum wake deficit on wake-added turbulence (set of 5 parameters: k_Def, FMin, DMin, DMax, Exp) (-) [>=0.0, >=0.0 and <=1.0, >=0.0, >DMin, >0.0] or DEFAULT [DEFAULT=[0.6, 0.0, 0.0, 2.0, 1.0 ]] FAST.Farm 78 WAT_k_Grad default WAT_k_Grad - Calibrated parameters for the influence of the radial velocity gradient of the wake deficit on wake-added turbulence (set of 5 parameters: k_Grad, FMin, DMin, DMax, Exp) (-) [>=0.0, >=0.0 and <=1.0, >=0.0, >DMin, >0.0] or DEFAULT [DEFAULT=[3.0, 0.0, 0.0, 12.0, 0.65] +AeroDyn 80\* NacArea 0, 0, 0 NacArea - Projected area of the nacelle in X, Y, Z in the nacelle coordinate system (m^2) +AeroDyn 81\* NacCd 0, 0, 0 NacCd - Drag coefficient for the nacelle areas defined above (-) +AeroDyn 82\* NacDragAC 0, 0, 0 NacDragAC - Position of aerodynamic center of nacelle drag in nacelle coordinates (m) ============================================= ======= ==================== ======================================================================================================================================================================================================== \*Exact line number depends on number of entries in various preceeding tables. diff --git a/modules/aerodyn/src/AeroDyn.f90 b/modules/aerodyn/src/AeroDyn.f90 index 578a02712d..f85eedfe89 100644 --- a/modules/aerodyn/src/AeroDyn.f90 +++ b/modules/aerodyn/src/AeroDyn.f90 @@ -1406,6 +1406,10 @@ subroutine SetParameters( InitInp, InputFileData, RotData, p, p_AD, ErrStat, Err p%CavitCheck = InputFileData%CavitCheck p%Buoyancy = InputFileData%Buoyancy + p%NacelleDrag = InputFileData%NacelleDrag + p%NacArea = RotData%NacArea + p%NacCd = RotData%NacCd + p%NacDragAC = RotData%NacDragAC p%CompAA = InputFileData%CompAA @@ -1994,6 +1998,12 @@ subroutine AD_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, call AD_CavtCrit(u, p, m, errStat2, errMsg2) if(Failed()) return + ! initialize nacelle mesh loads + do iR = 1,size(p%rotors) + y%rotors(iR)%NacelleLoad%Force = 0.0_ReKi + y%rotors(iR)%NacelleLoad%Moment = 0.0_ReKi + end do + ! Calculate buoyant loads do iR = 1,size(p%rotors) if ( p%rotors(iR)%Buoyancy ) then @@ -2002,6 +2012,14 @@ subroutine AD_CalcOutput( t, u, p, x, xd, z, OtherState, y, m, ErrStat, ErrMsg, end if end do + ! Calculate nacelle drag loads + do iR = 1,size(p%rotors) + if ( p%rotors(iR)%NacelleDrag ) then + call computeNacelleDrag( u%rotors(iR), p%rotors(iR), m%rotors(iR), y%rotors(iR), m%Inflow(1)%RotInflow(iR), ErrStat, ErrMsg ) + if(Failed()) return + end if + end do + !------------------------------------------------------- ! get values to output to file: !------------------------------------------------------- @@ -2579,6 +2597,7 @@ subroutine CalcBuoyantLoads( u, p, m, y, ErrStat, ErrMsg ) if ( p%VolNac == 0 ) then m%NacFB = NacFBtmp m%NacMB = NacMBtmp + else ! Check that nacelle node does not go beneath the seabed or pierce the free surface if ( u%NacelleMotion%Position(3,1) + u%NacelleMotion%TranslationDisp(3,1) >= p%MSL2SWL .OR. u%NacelleMotion%Position(3,1) + u%NacelleMotion%TranslationDisp(3,1) <= -p%WtrDpth ) & @@ -2614,11 +2633,17 @@ subroutine CalcBuoyantLoads( u, p, m, y, ErrStat, ErrMsg ) ! Pass to m variable m%NacFB = NacFBtmp m%NacMB = NacMBtmp + end if - ! Assign buoyant loads to nacelle mesh - y%NacelleLoad%Force(:,1) = NacFBtmp - y%NacelleLoad%Moment(:,1) = NacMBtmp + ! Assign buoyant loads to nacelle mesh. Mesh might contain the nacelle drag force. + y%NacelleLoad%Force(:,1) = y%NacelleLoad%Force(:,1) + NacFBtmp + y%NacelleLoad%Moment(:,1) = y%NacelleLoad%Moment(:,1) + NacMBtmp + + ! Passing buoyant loads to m variable, drag loads are called after buoyant loads + m%NacFi = y%NacelleLoad%Force(:,1) + m%NacMi = y%NacelleLoad%Moment(:,1) + end subroutine CalcBuoyantLoads !---------------------------------------------------------------------------------------------------------------------------------- @@ -4237,6 +4262,25 @@ SUBROUTINE ValidateInputData( InitInp, InputFileData, NumBl, ErrStat, ErrMsg ) if (InputFileData%DBEMT_Mod /= DBEMT_None .and. InputFileData%DBEMT_Mod /= DBEMT_cont_tauConst) then call SetErrStat( ErrID_Fatal, 'DBEMT Mod must be 0 or 3 (continuous formulation with constant tau1) for linearization. Set DBEMT_Mod=0,3.', ErrStat, ErrMsg, RoutineName ) end if + + if (InputFileData%NacelleDrag) then + call SetErrStat( ErrID_Fatal, 'Nacelle drag cannot currently be used for linearization. Set NacelleDrag = false.', ErrStat, ErrMsg, RoutineName ) + end if + end if + + !.................. + ! check for nacelle drag parameters + !.................. + + if (InputFileData%NacelleDrag) then + do iR = 1,size(NumBl) + if (any(InputFileData%rotors(iR)%NacArea < 0.0_ReKi)) then + call SetErrStat( ErrID_Fatal, 'Nacelle projected area should not be negative for drag model.', ErrStat, ErrMsg, RoutineName ) + end if + if (any(InputFileData%rotors(iR)%NacCd < 0.0_ReKi)) then + call SetErrStat( ErrID_Fatal, 'Nacelle drag coefficient should not be negative for drag model.', ErrStat, ErrMsg, RoutineName ) + end if + end do end if contains @@ -7651,4 +7695,84 @@ SUBROUTINE Compute_dX(p, x_p, x_m, delta_p, delta_m, dX) END SUBROUTINE Compute_dX +!------------------------------------------------------------------------------------------------------- +!> This routine calculates nacelle drag loads on a turbine. +SUBROUTINE computeNacelleDrag( u, p, m, y, RotInflow, ErrStat, ErrMsg ) + + TYPE(RotInputType) , INTENT(IN ) :: u !< AD inputs - used for mesh node positions + TYPE(RotParameterType) , INTENT(IN ) :: p !< Parameters + TYPE(RotMiscVarType) , INTENT(INOUT) :: m !< Misc/optimization variables + TYPE(RotOutputType) , INTENT(INOUT) :: y !< Outputs computed at t + TYPE(RotInflowType) , INTENT(IN ) :: RotInflow !< Rotor inflow + INTEGER(IntKi) , INTENT( OUT) :: ErrStat !< Error status of the operation + CHARACTER(*) , INTENT( OUT) :: ErrMsg !< Error message if ErrStat /= ErrID_None + ! Local Vars + REAL(ReKi) :: totalAngle ! Angle between incoming wind direction and nacelle, + REAL(ReKi) :: tiltAngle ! Tilt angle of the nacelle. + REAL(ReKi) :: yawAngle ! Current Yaw Bearing. + REAL(ReKi) :: areaCd ! Area*Cd of the nacelle projected in the wind direction + REAL(ReKi) :: forceMag ! Drag force aligned with wind direction + Real(ReKi) :: unitDiskVec(3) ! unit vector aligned at an angle of "totalAngle" from yawed rotor disk + Real(ReKi) :: areaCdVec(3) ! Vec containing areas of yz, xz and xy faces of the nacelle * respective Cd's + REAL(ReKi) :: hubHeigthWindSpeed(3) ! hubHeigthWindSpeed(1), hubHeigthWindSpeed(2), and hubHeigthWindSpeed(3) and u, v, and w wind velocities at Hub height + REAL(ReKi) :: force(3) ! Forces in nacelle c.s + REAL(ReKi) :: moment(3) ! Moments in nacelle c.s + + ErrStat = ErrID_None + ErrMsg = "" + + ! ! Calculating the relative inflow velocity at nacelle + hubHeigthWindSpeed = RotInflow%InflowOnNacelle(:,1) - u%NacelleMotion%TranslationVel(:,1) + + ! Calculating required angles. + yawAngle = atan2(u%NacelleMotion%Orientation(1,2,1), u%NacelleMotion%Orientation(1,1,1)) + call MPi2Pi(yawAngle) + + totalAngle = atan2(hubHeigthWindSpeed(2),hubHeigthWindSpeed(1)) - yawAngle + call MPi2Pi(totalAngle) + + tiltAngle = -1 * atan2(u%NacelleMotion%Orientation(1,3,1), u%NacelleMotion%Orientation(1,1,1)) + call MPi2Pi(tiltAngle) + + ! Unit vector of incoming wind to the nacelle. + unitDiskVec(1) = abs(cos(totalAngle)) + unitDiskVec(2) = abs(sin(totalAngle)) + unitDiskVec(3) = abs(sin(tiltAngle)) + + ! Calculating Area * Cd for the respective areas. Allows for multiple Cds + areaCdVec(1) = p%NacArea(1) * p%NacCd(1) + areaCdVec(2) = p%NacArea(2) * p%NacCd(2) + areaCdVec(3) = p%NacArea(3) * p%NacCd(3) + + ! total nacelle area * Cd projected into incoming wind direction + areaCd = dot_product(areaCdVec, unitDiskVec) + + ! Find drag force (in global X direction) Assuming dominant direction of wind. + forceMag = 0.5 * p%AirDens * (hubHeigthWindSpeed(1)**2 + hubHeigthWindSpeed(2)**2) * areaCd + + ! Decompose along the nacelle length, width and height + force = unitDiskVec*forceMag + + force(1) = sign(force(1),cos(totalAngle)) + force(2) = sign(force(2),sin(totalAngle)) + force(3) = sign(force(3),sin(tiltAngle)) + + ! moment affect due to offset between nacelle reference position and nacelle Drag AC + moment = CROSS_PRODUCT(p%NacDragAC, force) + + ! Add drag forces and moments to nacelle node + y%NacelleLoad%Force(:,1) = y%NacelleLoad%Force(:,1) + matmul(transpose(u%NacelleMotion%Orientation(:,:,1)),force) + y%NacelleLoad%Moment(:,1) = y%NacelleLoad%Moment(:,1) + matmul(transpose(u%NacelleMotion%Orientation(:,:,1)),moment) + + ! Adding to misc vars for output in Global c.s. + m%NacDragF = matmul(transpose(u%NacelleMotion%Orientation(:,:,1)),force) + m%NacDragM = matmul(transpose(u%NacelleMotion%Orientation(:,:,1)),moment) + m%NacFi = y%NacelleLoad%Force(:,1) + m%NacMi = y%NacelleLoad%Moment(:,1) + + + +END SUBROUTINE computeNacelleDrag + +!---------------------------------------------------------------------------------------------------------------------------------- END MODULE AeroDyn diff --git a/modules/aerodyn/src/AeroDyn_IO.f90 b/modules/aerodyn/src/AeroDyn_IO.f90 index ea6f22d0c2..fba1f187c0 100644 --- a/modules/aerodyn/src/AeroDyn_IO.f90 +++ b/modules/aerodyn/src/AeroDyn_IO.f90 @@ -204,7 +204,7 @@ subroutine Calc_WriteOutput_AD() m%AllOuts( HbMbz ) = tmpHubMB(3) end if - ! nacelle outputs + ! nacelle buoyancy outputs if ( p%Buoyancy ) then tmp = matmul( u%NacelleMotion%Orientation(:,:,1) , m%NacFB ) m%AllOuts( NcFbx ) = tmp(1) @@ -217,6 +217,34 @@ subroutine Calc_WriteOutput_AD() m%AllOuts( NcMbz ) = tmp(3) end if + ! nacelle drag outputs + if ( p%NacelleDrag ) then + + tmp = matmul( u%NacelleMotion%Orientation(:,:,1) , m%NacDragF ) + m%AllOuts( NcFdx ) = tmp(1) + m%AllOuts( NcFdy ) = tmp(2) + m%AllOuts( NcFdz ) = tmp(3) + + tmp = matmul( u%NacelleMotion%Orientation(:,:,1) , m%NacDragM ) + m%AllOuts( NcMdx ) = tmp(1) + m%AllOuts( NcMdy ) = tmp(2) + m%AllOuts( NcMdz ) = tmp(3) + end if + + ! nacelle total forces and moments + if ( p%Buoyancy .OR. p%NacelleDrag) then + + tmp = m%NacFi + m%AllOuts( NcFxi ) = tmp(1) + m%AllOuts( NcFyi ) = tmp(2) + m%AllOuts( NcFzi ) = tmp(3) + + tmp = m%NacMi + m%AllOuts( NcMxi ) = tmp(1) + m%AllOuts( NcMyi ) = tmp(2) + m%AllOuts( NcMzi ) = tmp(3) + end if + ! blade outputs do k=1,min(p%numBlades,AD_MaxBl_Out) ! limit this do beta=1,p%NBlOuts @@ -751,6 +779,9 @@ SUBROUTINE ParsePrimaryFileInfo( PriPath, InitInp, InputFile, RootName, NumBlade if (Failed()) return ! Buoyancy - Include buoyancy effects? (flag) call ParseVar( FileInfo_In, CurLine, "Buoyancy", InputFileData%Buoyancy, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return + ! NacelleDrag - Include Nacelle Drag effects? (flag) + call ParseVar( FileInfo_In, CurLine, "NacelleDrag", InputFileData%NacelleDrag, ErrStat2, ErrMsg2, UnEc ) if (Failed()) return ! CompAA - Flag to compute AeroAcoustics calculation [only used when WakeMod=1 or 2] call ParseVar( FileInfo_In, CurLine, "CompAA", InputFileData%CompAA, ErrStat2, ErrMsg2, UnEc ) @@ -992,6 +1023,16 @@ SUBROUTINE ParsePrimaryFileInfo( PriPath, InitInp, InputFile, RootName, NumBlade ! NacCenB - Nacelle center of buoyancy x,y,z direction offsets (m) call ParseAry( FileInfo_In, CurLine, 'NacCenB', InputFileData%rotors(iR)%NacCenB, 3 , ErrStat2, ErrMsg2, UnEc ) if (Failed()) return + + ! NacArea - Projected area of the nacelle in X, Y, Z in the nacelle coordinate system (m^2) + call ParseAry( FileInfo_In, CurLine, "NacArea", InputFileData%rotors(iR)%NacArea, 3, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return + ! NacCd - Drag coefficient for the nacelle areas defined above (-) + call ParseAry( FileInfo_In, CurLine, "NacCd", InputFileData%rotors(iR)%NacCd, 3, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return + ! NacDragAC - Position of aerodynamic center of nacelle drag in nacelle coordinates (m) + call ParseAry( FileInfo_In, CurLine, "NacDragAC", InputFileData%rotors(iR)%NacDragAC, 3, ErrStat2, ErrMsg2, UnEc ) + if (Failed()) return end do !====== Tail fin aerodynamics ======================================================================== @@ -1673,6 +1714,14 @@ SUBROUTINE AD_PrintSum( InputFileData, p, p_AD, u, y, ErrStat, ErrMsg ) end if WRITE (UnSu,Ec_LgFrmt) p%Buoyancy, 'Buoyancy', 'Include buoyancy effects? '//TRIM(Msg) + ! Nacelle Drag + if (p%NacelleDrag) then + Msg = 'Yes' + else + Msg = 'No' + end if + WRITE (UnSu,Ec_LgFrmt) p%NacelleDrag, 'NacelleDrag', 'Include NacelleDrag effects? '//TRIM(Msg) + if (p_AD%Wake_Mod/=WakeMod_none) then WRITE (UnSu,'(A)') '====== Blade-Element/Momentum Theory Options ======================================================' @@ -1956,7 +2005,27 @@ SUBROUTINE SetOutParam(OutList, p, p_AD, ErrStat, ErrMsg ) InvalidOutput( BNMbs(:,i) ) = .true. end do end if + + if (.not. p%NacelleDrag) then ! Invalid Nacelle Drag loads + InvalidOutput( NcFdx ) = .true. + InvalidOutput( NcFdy ) = .true. + InvalidOutput( NcFdz ) = .true. + InvalidOutput( NcMdx ) = .true. + InvalidOutput( NcMdy ) = .true. + InvalidOutput( NcMdz ) = .true. + end if + + if (.not. (p%NacelleDrag .OR. p%Buoyancy)) then ! Invalid Nacelle Total loads + InvalidOutput( NcFxi ) = .true. + InvalidOutput( NcFyi ) = .true. + InvalidOutput( NcFzi ) = .true. + InvalidOutput( NcMxi ) = .true. + InvalidOutput( NcMyi ) = .true. + InvalidOutput( NcMzi ) = .true. + end if + + DO i = p%NTwOuts+1,9 ! Invalid tower nodes InvalidOutput( TwNVUnd(:,i) ) = .true. diff --git a/modules/aerodyn/src/AeroDyn_IO_Params.f90 b/modules/aerodyn/src/AeroDyn_IO_Params.f90 index 3568cd8b32..d31c280d2c 100644 --- a/modules/aerodyn/src/AeroDyn_IO_Params.f90 +++ b/modules/aerodyn/src/AeroDyn_IO_Params.f90 @@ -1546,36 +1546,48 @@ module AeroDyn_IO_Params INTEGER(IntKi), PARAMETER :: NcMbx = 1496 INTEGER(IntKi), PARAMETER :: NcMby = 1497 INTEGER(IntKi), PARAMETER :: NcMbz = 1498 + INTEGER(IntKi), PARAMETER :: NcFdx = 1499 + INTEGER(IntKi), PARAMETER :: NcFdy = 1500 + INTEGER(IntKi), PARAMETER :: NcFdz = 1501 + INTEGER(IntKi), PARAMETER :: NcMdx = 1502 + INTEGER(IntKi), PARAMETER :: NcMdy = 1503 + INTEGER(IntKi), PARAMETER :: NcMdz = 1504 + INTEGER(IntKi), PARAMETER :: NcFxi = 1505 + INTEGER(IntKi), PARAMETER :: NcFyi = 1506 + INTEGER(IntKi), PARAMETER :: NcFzi = 1507 + INTEGER(IntKi), PARAMETER :: NcMxi = 1508 + INTEGER(IntKi), PARAMETER :: NcMyi = 1509 + INTEGER(IntKi), PARAMETER :: NcMzi = 1510 ! TailFin: - INTEGER(IntKi), PARAMETER :: TFAlpha = 1499 - INTEGER(IntKi), PARAMETER :: TFMach = 1500 - INTEGER(IntKi), PARAMETER :: TFRe = 1501 - INTEGER(IntKi), PARAMETER :: TFVrel = 1502 - INTEGER(IntKi), PARAMETER :: TFVundxi = 1503 - INTEGER(IntKi), PARAMETER :: TFVundyi = 1504 - INTEGER(IntKi), PARAMETER :: TFVundzi = 1505 - INTEGER(IntKi), PARAMETER :: TFVindxi = 1506 - INTEGER(IntKi), PARAMETER :: TFVindyi = 1507 - INTEGER(IntKi), PARAMETER :: TFVindzi = 1508 - INTEGER(IntKi), PARAMETER :: TFVrelxi = 1509 - INTEGER(IntKi), PARAMETER :: TFVrelyi = 1510 - INTEGER(IntKi), PARAMETER :: TFVrelzi = 1511 - INTEGER(IntKi), PARAMETER :: TFSTVxi = 1512 - INTEGER(IntKi), PARAMETER :: TFSTVyi = 1513 - INTEGER(IntKi), PARAMETER :: TFSTVzi = 1514 - INTEGER(IntKi), PARAMETER :: TFFxi = 1515 - INTEGER(IntKi), PARAMETER :: TFFyi = 1516 - INTEGER(IntKi), PARAMETER :: TFFzi = 1517 - INTEGER(IntKi), PARAMETER :: TFMxi = 1518 - INTEGER(IntKi), PARAMETER :: TFMyi = 1519 - INTEGER(IntKi), PARAMETER :: TFMzi = 1520 + INTEGER(IntKi), PARAMETER :: TFAlpha = 1511 + INTEGER(IntKi), PARAMETER :: TFMach = 1512 + INTEGER(IntKi), PARAMETER :: TFRe = 1513 + INTEGER(IntKi), PARAMETER :: TFVrel = 1514 + INTEGER(IntKi), PARAMETER :: TFVundxi = 1515 + INTEGER(IntKi), PARAMETER :: TFVundyi = 1516 + INTEGER(IntKi), PARAMETER :: TFVundzi = 1517 + INTEGER(IntKi), PARAMETER :: TFVindxi = 1518 + INTEGER(IntKi), PARAMETER :: TFVindyi = 1519 + INTEGER(IntKi), PARAMETER :: TFVindzi = 1520 + INTEGER(IntKi), PARAMETER :: TFVrelxi = 1521 + INTEGER(IntKi), PARAMETER :: TFVrelyi = 1522 + INTEGER(IntKi), PARAMETER :: TFVrelzi = 1523 + INTEGER(IntKi), PARAMETER :: TFSTVxi = 1524 + INTEGER(IntKi), PARAMETER :: TFSTVyi = 1525 + INTEGER(IntKi), PARAMETER :: TFSTVzi = 1526 + INTEGER(IntKi), PARAMETER :: TFFxi = 1527 + INTEGER(IntKi), PARAMETER :: TFFyi = 1528 + INTEGER(IntKi), PARAMETER :: TFFzi = 1529 + INTEGER(IntKi), PARAMETER :: TFMxi = 1530 + INTEGER(IntKi), PARAMETER :: TFMyi = 1531 + INTEGER(IntKi), PARAMETER :: TFMzi = 1532 ! The maximum number of output channels which can be output by the code. - INTEGER(IntKi), PARAMETER :: MaxOutPts = 1520 + INTEGER(IntKi), PARAMETER :: MaxOutPts = 1532 !End of code generated by Matlab script ! =================================================================================================== @@ -1874,7 +1886,7 @@ module AeroDyn_IO_Params - CHARACTER(OutStrLenM1), PARAMETER :: ValidParamAry(1594) = (/ & ! This lists the names of the allowed parameters, which must be sorted alphabetically + CHARACTER(OutStrLenM1), PARAMETER :: ValidParamAry(1606) = (/ & ! This lists the names of the allowed parameters, which must be sorted alphabetically "B1AEROFX ","B1AEROFXI","B1AEROFY ","B1AEROFYI","B1AEROFZ ","B1AEROFZI","B1AEROMX ","B1AEROMXI", & "B1AEROMY ","B1AEROMYI","B1AEROMZ ","B1AEROMZI","B1AEROPWR","B1AZIMUTH","B1FLDFX ","B1FLDFXI ", & "B1FLDFY ","B1FLDFYI ","B1FLDFZ ","B1FLDFZI ","B1FLDMX ","B1FLDMXI ","B1FLDMY ","B1FLDMYI ", & @@ -2045,37 +2057,38 @@ module AeroDyn_IO_Params "B4AEROMZ ","B4AEROMZI","B4AEROPWR","B4FLDFX ","B4FLDFXI ","B4FLDFY ","B4FLDFYI ","B4FLDFZ ", & "B4FLDFZI ","B4FLDMX ","B4FLDMXI ","B4FLDMY ","B4FLDMYI ","B4FLDMZ ","B4FLDMZI ","B4FLDPWR ", & "DBEMTAU1 ","HBFBX ","HBFBY ","HBFBZ ","HBMBX ","HBMBY ","HBMBZ ","NCFBX ", & - "NCFBY ","NCFBZ ","NCMBX ","NCMBY ","NCMBZ ","RTAEROCP ","RTAEROCQ ","RTAEROCT ", & - "RTAEROFXH","RTAEROFXI","RTAEROFYH","RTAEROFYI","RTAEROFZH","RTAEROFZI","RTAEROMXH","RTAEROMXI", & - "RTAEROMYH","RTAEROMYI","RTAEROMZH","RTAEROMZI","RTAEROPWR","RTAREA ","RTFLDCP ","RTFLDCQ ", & - "RTFLDCT ","RTFLDFXG ","RTFLDFXH ","RTFLDFXI ","RTFLDFYG ","RTFLDFYH ","RTFLDFYI ","RTFLDFZG ", & - "RTFLDFZH ","RTFLDFZI ","RTFLDMXG ","RTFLDMXH ","RTFLDMXI ","RTFLDMYG ","RTFLDMYH ","RTFLDMYI ", & - "RTFLDMZG ","RTFLDMZH ","RTFLDMZI ","RTFLDPWR ","RTSKEW ","RTSPEED ","RTTSR ","RTVAVGXH ", & - "RTVAVGYH ","RTVAVGZH ","TFALPHA ","TFFXI ","TFFYI ","TFFZI ","TFMACH ","TFMXI ", & - "TFMYI ","TFMZI ","TFRE ","TFSTVXI ","TFSTVYI ","TFSTVZI ","TFVINDXI ","TFVINDYI ", & - "TFVINDZI ","TFVREL ","TFVRELXI ","TFVRELYI ","TFVRELZI ","TFVUNDXI ","TFVUNDYI ","TFVUNDZI ", & - "TWN1DYNP ","TWN1FBX ","TWN1FBY ","TWN1FBZ ","TWN1FDX ","TWN1FDY ","TWN1M ","TWN1MBX ", & - "TWN1MBY ","TWN1MBZ ","TWN1RE ","TWN1STVX ","TWN1STVY ","TWN1STVZ ","TWN1VREL ","TWN1VUNDX", & - "TWN1VUNDY","TWN1VUNDZ","TWN2DYNP ","TWN2FBX ","TWN2FBY ","TWN2FBZ ","TWN2FDX ","TWN2FDY ", & - "TWN2M ","TWN2MBX ","TWN2MBY ","TWN2MBZ ","TWN2RE ","TWN2STVX ","TWN2STVY ","TWN2STVZ ", & - "TWN2VREL ","TWN2VUNDX","TWN2VUNDY","TWN2VUNDZ","TWN3DYNP ","TWN3FBX ","TWN3FBY ","TWN3FBZ ", & - "TWN3FDX ","TWN3FDY ","TWN3M ","TWN3MBX ","TWN3MBY ","TWN3MBZ ","TWN3RE ","TWN3STVX ", & - "TWN3STVY ","TWN3STVZ ","TWN3VREL ","TWN3VUNDX","TWN3VUNDY","TWN3VUNDZ","TWN4DYNP ","TWN4FBX ", & - "TWN4FBY ","TWN4FBZ ","TWN4FDX ","TWN4FDY ","TWN4M ","TWN4MBX ","TWN4MBY ","TWN4MBZ ", & - "TWN4RE ","TWN4STVX ","TWN4STVY ","TWN4STVZ ","TWN4VREL ","TWN4VUNDX","TWN4VUNDY","TWN4VUNDZ", & - "TWN5DYNP ","TWN5FBX ","TWN5FBY ","TWN5FBZ ","TWN5FDX ","TWN5FDY ","TWN5M ","TWN5MBX ", & - "TWN5MBY ","TWN5MBZ ","TWN5RE ","TWN5STVX ","TWN5STVY ","TWN5STVZ ","TWN5VREL ","TWN5VUNDX", & - "TWN5VUNDY","TWN5VUNDZ","TWN6DYNP ","TWN6FBX ","TWN6FBY ","TWN6FBZ ","TWN6FDX ","TWN6FDY ", & - "TWN6M ","TWN6MBX ","TWN6MBY ","TWN6MBZ ","TWN6RE ","TWN6STVX ","TWN6STVY ","TWN6STVZ ", & - "TWN6VREL ","TWN6VUNDX","TWN6VUNDY","TWN6VUNDZ","TWN7DYNP ","TWN7FBX ","TWN7FBY ","TWN7FBZ ", & - "TWN7FDX ","TWN7FDY ","TWN7M ","TWN7MBX ","TWN7MBY ","TWN7MBZ ","TWN7RE ","TWN7STVX ", & - "TWN7STVY ","TWN7STVZ ","TWN7VREL ","TWN7VUNDX","TWN7VUNDY","TWN7VUNDZ","TWN8DYNP ","TWN8FBX ", & - "TWN8FBY ","TWN8FBZ ","TWN8FDX ","TWN8FDY ","TWN8M ","TWN8MBX ","TWN8MBY ","TWN8MBZ ", & - "TWN8RE ","TWN8STVX ","TWN8STVY ","TWN8STVZ ","TWN8VREL ","TWN8VUNDX","TWN8VUNDY","TWN8VUNDZ", & - "TWN9DYNP ","TWN9FBX ","TWN9FBY ","TWN9FBZ ","TWN9FDX ","TWN9FDY ","TWN9M ","TWN9MBX ", & - "TWN9MBY ","TWN9MBZ ","TWN9RE ","TWN9STVX ","TWN9STVY ","TWN9STVZ ","TWN9VREL ","TWN9VUNDX", & - "TWN9VUNDY","TWN9VUNDZ"/) - INTEGER(IntKi), PARAMETER :: ParamIndxAry(1594) = (/ & ! This lists the index into AllOuts(:) of the allowed parameters ValidParamAry(:) + "NCFBY ","NCFBZ ","NCFDX ","NCFDY ","NCFDZ ","NCFXI ","NCFYI ","NCFZI ", & + "NCMBX ","NCMBY ","NCMBZ ","NCMDX ","NCMDY ","NCMDZ ","NCMXI ","NCMYI ", & + "NCMZI ","RTAEROCP ","RTAEROCQ ","RTAEROCT ","RTAEROFXH","RTAEROFXI","RTAEROFYH","RTAEROFYI", & + "RTAEROFZH","RTAEROFZI","RTAEROMXH","RTAEROMXI","RTAEROMYH","RTAEROMYI","RTAEROMZH","RTAEROMZI", & + "RTAEROPWR","RTAREA ","RTFLDCP ","RTFLDCQ ","RTFLDCT ","RTFLDFXG ","RTFLDFXH ","RTFLDFXI ", & + "RTFLDFYG ","RTFLDFYH ","RTFLDFYI ","RTFLDFZG ","RTFLDFZH ","RTFLDFZI ","RTFLDMXG ","RTFLDMXH ", & + "RTFLDMXI ","RTFLDMYG ","RTFLDMYH ","RTFLDMYI ","RTFLDMZG ","RTFLDMZH ","RTFLDMZI ","RTFLDPWR ", & + "RTSKEW ","RTSPEED ","RTTSR ","RTVAVGXH ","RTVAVGYH ","RTVAVGZH ","TFALPHA ","TFFXI ", & + "TFFYI ","TFFZI ","TFMACH ","TFMXI ","TFMYI ","TFMZI ","TFRE ","TFSTVXI ", & + "TFSTVYI ","TFSTVZI ","TFVINDXI ","TFVINDYI ","TFVINDZI ","TFVREL ","TFVRELXI ","TFVRELYI ", & + "TFVRELZI ","TFVUNDXI ","TFVUNDYI ","TFVUNDZI ","TWN1DYNP ","TWN1FBX ","TWN1FBY ","TWN1FBZ ", & + "TWN1FDX ","TWN1FDY ","TWN1M ","TWN1MBX ","TWN1MBY ","TWN1MBZ ","TWN1RE ","TWN1STVX ", & + "TWN1STVY ","TWN1STVZ ","TWN1VREL ","TWN1VUNDX","TWN1VUNDY","TWN1VUNDZ","TWN2DYNP ","TWN2FBX ", & + "TWN2FBY ","TWN2FBZ ","TWN2FDX ","TWN2FDY ","TWN2M ","TWN2MBX ","TWN2MBY ","TWN2MBZ ", & + "TWN2RE ","TWN2STVX ","TWN2STVY ","TWN2STVZ ","TWN2VREL ","TWN2VUNDX","TWN2VUNDY","TWN2VUNDZ", & + "TWN3DYNP ","TWN3FBX ","TWN3FBY ","TWN3FBZ ","TWN3FDX ","TWN3FDY ","TWN3M ","TWN3MBX ", & + "TWN3MBY ","TWN3MBZ ","TWN3RE ","TWN3STVX ","TWN3STVY ","TWN3STVZ ","TWN3VREL ","TWN3VUNDX", & + "TWN3VUNDY","TWN3VUNDZ","TWN4DYNP ","TWN4FBX ","TWN4FBY ","TWN4FBZ ","TWN4FDX ","TWN4FDY ", & + "TWN4M ","TWN4MBX ","TWN4MBY ","TWN4MBZ ","TWN4RE ","TWN4STVX ","TWN4STVY ","TWN4STVZ ", & + "TWN4VREL ","TWN4VUNDX","TWN4VUNDY","TWN4VUNDZ","TWN5DYNP ","TWN5FBX ","TWN5FBY ","TWN5FBZ ", & + "TWN5FDX ","TWN5FDY ","TWN5M ","TWN5MBX ","TWN5MBY ","TWN5MBZ ","TWN5RE ","TWN5STVX ", & + "TWN5STVY ","TWN5STVZ ","TWN5VREL ","TWN5VUNDX","TWN5VUNDY","TWN5VUNDZ","TWN6DYNP ","TWN6FBX ", & + "TWN6FBY ","TWN6FBZ ","TWN6FDX ","TWN6FDY ","TWN6M ","TWN6MBX ","TWN6MBY ","TWN6MBZ ", & + "TWN6RE ","TWN6STVX ","TWN6STVY ","TWN6STVZ ","TWN6VREL ","TWN6VUNDX","TWN6VUNDY","TWN6VUNDZ", & + "TWN7DYNP ","TWN7FBX ","TWN7FBY ","TWN7FBZ ","TWN7FDX ","TWN7FDY ","TWN7M ","TWN7MBX ", & + "TWN7MBY ","TWN7MBZ ","TWN7RE ","TWN7STVX ","TWN7STVY ","TWN7STVZ ","TWN7VREL ","TWN7VUNDX", & + "TWN7VUNDY","TWN7VUNDZ","TWN8DYNP ","TWN8FBX ","TWN8FBY ","TWN8FBZ ","TWN8FDX ","TWN8FDY ", & + "TWN8M ","TWN8MBX ","TWN8MBY ","TWN8MBZ ","TWN8RE ","TWN8STVX ","TWN8STVY ","TWN8STVZ ", & + "TWN8VREL ","TWN8VUNDX","TWN8VUNDY","TWN8VUNDZ","TWN9DYNP ","TWN9FBX ","TWN9FBY ","TWN9FBZ ", & + "TWN9FDX ","TWN9FDY ","TWN9M ","TWN9MBX ","TWN9MBY ","TWN9MBZ ","TWN9RE ","TWN9STVX ", & + "TWN9STVY ","TWN9STVZ ","TWN9VREL ","TWN9VUNDX","TWN9VUNDY","TWN9VUNDZ"/) + INTEGER(IntKi), PARAMETER :: ParamIndxAry(1606) = (/ & ! This lists the index into AllOuts(:) of the allowed parameters ValidParamAry(:) B1AeroFx , B1AeroFxi , B1AeroFy , B1AeroFyi , B1AeroFz , B1AeroFzi , B1AeroMx , B1AeroMxi , & B1AeroMy , B1AeroMyi , B1AeroMz , B1AeroMzi , B1AeroPwr , B1Azimuth , B1AeroFx , B1AeroFxi , & B1AeroFy , B1AeroFyi , B1AeroFz , B1AeroFzi , B1AeroMx , B1AeroMxi , B1AeroMy , B1AeroMyi , & @@ -2246,38 +2259,39 @@ module AeroDyn_IO_Params B4AeroMz , B4AeroMzi , B4AeroPwr , B4AeroFx , B4AeroFxi , B4AeroFy , B4AeroFyi , B4AeroFz , & B4AeroFzi , B4AeroMx , B4AeroMxi , B4AeroMy , B4AeroMyi , B4AeroMz , B4AeroMzi , B4AeroPwr , & DBEMTau1 , HbFbx , HbFby , HbFbz , HbMbx , HbMby , HbMbz , NcFbx , & - NcFby , NcFbz , NcMbx , NcMby , NcMbz , RtAeroCp , RtAeroCq , RtAeroCt , & - RtAeroFxh , RtAeroFxi , RtAeroFyh , RtAeroFyi , RtAeroFzh , RtAeroFzi , RtAeroMxh , RtAeroMxi , & - RtAeroMyh , RtAeroMyi , RtAeroMzh , RtAeroMzi , RtAeroPwr , RtArea , RtAeroCp , RtAeroCq , & - RtAeroCt , RtAeroFxi , RtAeroFxh , RtAeroFxi , RtAeroFyi , RtAeroFyh , RtAeroFyi , RtAeroFzi , & - RtAeroFzh , RtAeroFzi , RtAeroMxi , RtAeroMxh , RtAeroMxi , RtAeroMyi , RtAeroMyh , RtAeroMyi , & - RtAeroMzi , RtAeroMzh , RtAeroMzi , RtAeroPwr , RtSkew , RtSpeed , RtTSR , RtVAvgxh , & - RtVAvgyh , RtVAvgzh , TFAlpha , TFFxi , TFFyi , TFFzi , TFMach , TFMxi , & - TFMyi , TFMzi , TFRe , TFSTVxi , TFSTVyi , TFSTVzi , TFVindxi , TFVindyi , & - TFVindzi , TFVrel , TFVrelxi , TFVrelyi , TFVrelzi , TFVundxi , TFVundyi , TFVundzi , & - TwN1DynP , TwN1Fbx , TwN1Fby , TwN1Fbz , TwN1Fdx , TwN1Fdy , TwN1M , TwN1Mbx , & - TwN1Mby , TwN1Mbz , TwN1Re , TwN1STVx , TwN1STVy , TwN1STVz , TwN1Vrel , TwN1VUndx , & - TwN1VUndy , TwN1VUndz , TwN2DynP , TwN2Fbx , TwN2Fby , TwN2Fbz , TwN2Fdx , TwN2Fdy , & - TwN2M , TwN2Mbx , TwN2Mby , TwN2Mbz , TwN2Re , TwN2STVx , TwN2STVy , TwN2STVz , & - TwN2Vrel , TwN2VUndx , TwN2VUndy , TwN2VUndz , TwN3DynP , TwN3Fbx , TwN3Fby , TwN3Fbz , & - TwN3Fdx , TwN3Fdy , TwN3M , TwN3Mbx , TwN3Mby , TwN3Mbz , TwN3Re , TwN3STVx , & - TwN3STVy , TwN3STVz , TwN3Vrel , TwN3VUndx , TwN3VUndy , TwN3VUndz , TwN4DynP , TwN4Fbx , & - TwN4Fby , TwN4Fbz , TwN4Fdx , TwN4Fdy , TwN4M , TwN4Mbx , TwN4Mby , TwN4Mbz , & - TwN4Re , TwN4STVx , TwN4STVy , TwN4STVz , TwN4Vrel , TwN4VUndx , TwN4VUndy , TwN4VUndz , & - TwN5DynP , TwN5Fbx , TwN5Fby , TwN5Fbz , TwN5Fdx , TwN5Fdy , TwN5M , TwN5Mbx , & - TwN5Mby , TwN5Mbz , TwN5Re , TwN5STVx , TwN5STVy , TwN5STVz , TwN5Vrel , TwN5VUndx , & - TwN5VUndy , TwN5VUndz , TwN6DynP , TwN6Fbx , TwN6Fby , TwN6Fbz , TwN6Fdx , TwN6Fdy , & - TwN6M , TwN6Mbx , TwN6Mby , TwN6Mbz , TwN6Re , TwN6STVx , TwN6STVy , TwN6STVz , & - TwN6Vrel , TwN6VUndx , TwN6VUndy , TwN6VUndz , TwN7DynP , TwN7Fbx , TwN7Fby , TwN7Fbz , & - TwN7Fdx , TwN7Fdy , TwN7M , TwN7Mbx , TwN7Mby , TwN7Mbz , TwN7Re , TwN7STVx , & - TwN7STVy , TwN7STVz , TwN7Vrel , TwN7VUndx , TwN7VUndy , TwN7VUndz , TwN8DynP , TwN8Fbx , & - TwN8Fby , TwN8Fbz , TwN8Fdx , TwN8Fdy , TwN8M , TwN8Mbx , TwN8Mby , TwN8Mbz , & - TwN8Re , TwN8STVx , TwN8STVy , TwN8STVz , TwN8Vrel , TwN8VUndx , TwN8VUndy , TwN8VUndz , & - TwN9DynP , TwN9Fbx , TwN9Fby , TwN9Fbz , TwN9Fdx , TwN9Fdy , TwN9M , TwN9Mbx , & - TwN9Mby , TwN9Mbz , TwN9Re , TwN9STVx , TwN9STVy , TwN9STVz , TwN9Vrel , TwN9VUndx , & - TwN9VUndy , TwN9VUndz /) - CHARACTER(ChanLen), PARAMETER :: ParamUnitsAry(1594) = (/ character(ChanLen) :: & ! This lists the units corresponding to the allowed parameters - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N-m) ","(N-m) ", & + NcFby , NcFbz , NcFdx , NcFdy , NcFdz , NcFxi , NcFyi , NcFzi , & + NcMbx , NcMby , NcMbz , NcMdx , NcMdy , NcMdz , NcMxi , NcMyi , & + NcMzi , RtAeroCp , RtAeroCq , RtAeroCt , RtAeroFxh , RtAeroFxi , RtAeroFyh , RtAeroFyi , & + RtAeroFzh , RtAeroFzi , RtAeroMxh , RtAeroMxi , RtAeroMyh , RtAeroMyi , RtAeroMzh , RtAeroMzi , & + RtAeroPwr , RtArea , RtAeroCp , RtAeroCq , RtAeroCt , RtAeroFxi , RtAeroFxh , RtAeroFxi , & + RtAeroFyi , RtAeroFyh , RtAeroFyi , RtAeroFzi , RtAeroFzh , RtAeroFzi , RtAeroMxi , RtAeroMxh , & + RtAeroMxi , RtAeroMyi , RtAeroMyh , RtAeroMyi , RtAeroMzi , RtAeroMzh , RtAeroMzi , RtAeroPwr , & + RtSkew , RtSpeed , RtTSR , RtVAvgxh , RtVAvgyh , RtVAvgzh , TFAlpha , TFFxi , & + TFFyi , TFFzi , TFMach , TFMxi , TFMyi , TFMzi , TFRe , TFSTVxi , & + TFSTVyi , TFSTVzi , TFVindxi , TFVindyi , TFVindzi , TFVrel , TFVrelxi , TFVrelyi , & + TFVrelzi , TFVundxi , TFVundyi , TFVundzi , TwN1DynP , TwN1Fbx , TwN1Fby , TwN1Fbz , & + TwN1Fdx , TwN1Fdy , TwN1M , TwN1Mbx , TwN1Mby , TwN1Mbz , TwN1Re , TwN1STVx , & + TwN1STVy , TwN1STVz , TwN1Vrel , TwN1VUndx , TwN1VUndy , TwN1VUndz , TwN2DynP , TwN2Fbx , & + TwN2Fby , TwN2Fbz , TwN2Fdx , TwN2Fdy , TwN2M , TwN2Mbx , TwN2Mby , TwN2Mbz , & + TwN2Re , TwN2STVx , TwN2STVy , TwN2STVz , TwN2Vrel , TwN2VUndx , TwN2VUndy , TwN2VUndz , & + TwN3DynP , TwN3Fbx , TwN3Fby , TwN3Fbz , TwN3Fdx , TwN3Fdy , TwN3M , TwN3Mbx , & + TwN3Mby , TwN3Mbz , TwN3Re , TwN3STVx , TwN3STVy , TwN3STVz , TwN3Vrel , TwN3VUndx , & + TwN3VUndy , TwN3VUndz , TwN4DynP , TwN4Fbx , TwN4Fby , TwN4Fbz , TwN4Fdx , TwN4Fdy , & + TwN4M , TwN4Mbx , TwN4Mby , TwN4Mbz , TwN4Re , TwN4STVx , TwN4STVy , TwN4STVz , & + TwN4Vrel , TwN4VUndx , TwN4VUndy , TwN4VUndz , TwN5DynP , TwN5Fbx , TwN5Fby , TwN5Fbz , & + TwN5Fdx , TwN5Fdy , TwN5M , TwN5Mbx , TwN5Mby , TwN5Mbz , TwN5Re , TwN5STVx , & + TwN5STVy , TwN5STVz , TwN5Vrel , TwN5VUndx , TwN5VUndy , TwN5VUndz , TwN6DynP , TwN6Fbx , & + TwN6Fby , TwN6Fbz , TwN6Fdx , TwN6Fdy , TwN6M , TwN6Mbx , TwN6Mby , TwN6Mbz , & + TwN6Re , TwN6STVx , TwN6STVy , TwN6STVz , TwN6Vrel , TwN6VUndx , TwN6VUndy , TwN6VUndz , & + TwN7DynP , TwN7Fbx , TwN7Fby , TwN7Fbz , TwN7Fdx , TwN7Fdy , TwN7M , TwN7Mbx , & + TwN7Mby , TwN7Mbz , TwN7Re , TwN7STVx , TwN7STVy , TwN7STVz , TwN7Vrel , TwN7VUndx , & + TwN7VUndy , TwN7VUndz , TwN8DynP , TwN8Fbx , TwN8Fby , TwN8Fbz , TwN8Fdx , TwN8Fdy , & + TwN8M , TwN8Mbx , TwN8Mby , TwN8Mbz , TwN8Re , TwN8STVx , TwN8STVy , TwN8STVz , & + TwN8Vrel , TwN8VUndx , TwN8VUndy , TwN8VUndz , TwN9DynP , TwN9Fbx , TwN9Fby , TwN9Fbz , & + TwN9Fdx , TwN9Fdy , TwN9M , TwN9Mbx , TwN9Mby , TwN9Mbz , TwN9Re , TwN9STVx , & + TwN9STVy , TwN9STVz , TwN9Vrel , TwN9VUndx , TwN9VUndy , TwN9VUndz /) +CHARACTER(ChanLen), PARAMETER :: ParamUnitsAry(1606) = (/ character(ChanLen) :: & ! This lists the units corresponding to the allowed parameters + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N-m) ","(N-m) ", & "(N-m) ","(N-m) ","(N-m) ","(N-m) ","(W) ","(deg) ","(N) ","(N) ", & "(N) ","(N) ","(N) ","(N) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ", & "(N-m) ","(N-m) ","(W) ","(deg) ","(-) ","(-) ","(-) ","(m) ", & @@ -2447,19 +2461,16 @@ module AeroDyn_IO_Params "(N-m) ","(N-m) ","(W) ","(N) ","(N) ","(N) ","(N) ","(N) ", & "(N) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ","(W) ", & "(s) ","(N) ","(N) ","(N) ","(N-m) ","(N-m) ","(N-m) ","(N) ", & - "(N) ","(N) ","(N-m) ","(N-m) ","(N-m) ","(-) ","(-) ","(-) ", & - "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N-m) ","(N-m) ", & - "(N-m) ","(N-m) ","(N-m) ","(N-m) ","(W) ","(m^2) ","(-) ","(-) ", & - "(-) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N) ", & + "(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ", & + "(N-m) ","(-) ","(-) ","(-) ","(N) ","(N) ","(N) ","(N) ", & "(N) ","(N) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ", & - "(N-m) ","(N-m) ","(N-m) ","(W) ","(deg) ","(rpm) ","(-) ","(m/s) ", & - "(m/s) ","(m/s) ","(deg) ","(N) ","(N) ","(N) ","(-) ","(N-m) ", & - "(N-m) ","(N-m) ","(-) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & + "(W) ","(m^2) ","(-) ","(-) ","(-) ","(N) ","(N) ","(N) ", & + "(N) ","(N) ","(N) ","(N) ","(N) ","(N) ","(N-m) ","(N-m) ", & + "(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ","(N-m) ","(W) ", & + "(deg) ","(rpm) ","(-) ","(m/s) ","(m/s) ","(m/s) ","(deg) ","(N) ", & + "(N) ","(N) ","(-) ","(N-m) ","(N-m) ","(N-m) ","(-) ","(m/s) ", & "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & - "(Pa) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(-) ","(N-m/m)", & - "(N-m/m)","(N-m/m)","(-) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & - "(m/s) ","(m/s) ","(Pa) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & - "(-) ","(N-m/m)","(N-m/m)","(N-m/m)","(-) ","(m/s) ","(m/s) ","(m/s) ", & "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(Pa) ","(N/m) ","(N/m) ","(N/m) ", & "(N/m) ","(N/m) ","(-) ","(N-m/m)","(N-m/m)","(N-m/m)","(-) ","(m/s) ", & "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(Pa) ","(N/m) ", & @@ -2476,7 +2487,11 @@ module AeroDyn_IO_Params "(-) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & "(Pa) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(-) ","(N-m/m)", & "(N-m/m)","(N-m/m)","(-) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ", & - "(m/s) ","(m/s) "/) + "(m/s) ","(m/s) ","(Pa) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ","(N/m) ", & + "(-) ","(N-m/m)","(N-m/m)","(N-m/m)","(-) ","(m/s) ","(m/s) ","(m/s) ", & + "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(Pa) ","(N/m) ","(N/m) ","(N/m) ", & + "(N/m) ","(N/m) ","(-) ","(N-m/m)","(N-m/m)","(N-m/m)","(-) ","(m/s) ", & + "(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) ","(m/s) "/) end module AeroDyn_IO_Params diff --git a/modules/aerodyn/src/AeroDyn_Registry.txt b/modules/aerodyn/src/AeroDyn_Registry.txt index 448ce588c4..8330824191 100644 --- a/modules/aerodyn/src/AeroDyn_Registry.txt +++ b/modules/aerodyn/src/AeroDyn_Registry.txt @@ -169,6 +169,9 @@ typedef ^ RotInputFile ReKi HubCenBx - - - "Hub center of buoyancy x directio # Nacelle typedef ^ RotInputFile ReKi VolNac - - - "Nacelle volume" m^3 typedef ^ RotInputFile ReKi NacCenB 3 - - "Position of nacelle center of buoyancy from yaw bearing in nacelle coordinates" m +typedef ^ RotInputFile ReKi NacArea 3 - - "Projected area of the nacelle in X, Y, Z in the nacelle coordinate system" m^2 +typedef ^ RotInputFile ReKi NacCd 3 - - "Drag cefficient for the nacelle areas defied above" - +typedef ^ RotInputFile ReKi NacDragAC 3 - - "Position of aerodynamic center of nacelle drag in nacelle coordinates" m # TailFin typedef ^ RotInputFile LOGICAL TFinAero - .FALSE. - "Calculate tail fin aerodynamics model (flag)" flag typedef ^ RotInputFile CHARACTER(1024) TFinFile - - - "Input file for tail fin aerodynamics [used only when TFinAero=True]" - @@ -183,6 +186,7 @@ typedef ^ AD_InputFile IntKi TwrShadow - - - "Type of tower influence on wind ba typedef ^ AD_InputFile LOGICAL TwrAero - - - "Calculate tower aerodynamic loads?" flag typedef ^ AD_InputFile Logical CavitCheck - - - "Flag that tells us if we want to check for cavitation" - typedef ^ AD_InputFile Logical Buoyancy - - - "Include buoyancy effects?" flag +typedef ^ AD_InputFile Logical NacelleDrag - - - "Include NacelleDrag effects?" flag typedef ^ AD_InputFile Logical CompAA - - - "Compute AeroAcoustic noise" flag typedef ^ AD_InputFile CHARACTER(1024) AA_InputFile - - - "AeroAcoustics input file name" "quoted strings" typedef ^ AD_InputFile CHARACTER(1024) ADBlFile {:} - - "AD blade file (NumBl filenames)" "quoted strings" @@ -318,6 +322,10 @@ typedef ^ RotMiscVarType ReKi HubFB {:} - - "buoyant force at hub node typedef ^ RotMiscVarType ReKi HubMB {:} - - "buoyant moment at hub node" Nm typedef ^ RotMiscVarType ReKi NacFB {:} - - "buoyant force at nacelle (tower top) node" N typedef ^ RotMiscVarType ReKi NacMB {:} - - "buoyant moment at nacelle (tower top) node" Nm +typedef ^ RotMiscVarType ReKi NacDragF {:} - - "drag force at nacelle (tower top) node" N +typedef ^ RotMiscVarType ReKi NacDragM {:} - - "drag moment at nacelle (tower top) node" Nm +typedef ^ RotMiscVarType ReKi NacFi {:} - - "Total force at nacelle (tower top) node" N +typedef ^ RotMiscVarType ReKi NacMi {:} - - "Total moment at nacelle (tower top) node" Nm typedef ^ RotMiscVarType MeshType BladeRootLoad {:} - - "meshes at blade root; used to compute an integral for mapping the output blade loads to single points (for writing to file only)" - typedef ^ RotMiscVarType MeshMapType B_L_2_R_P {:} - - "mapping data structure to map each bladeLoad output mesh to corresponding MiscVar%BladeRootLoad mesh" typedef ^ RotMiscVarType MeshType BladeBuoyLoadPoint {:} - - "point mesh for lumped buoyant blade loads" - @@ -394,6 +402,9 @@ typedef ^ RotParameterType ReKi VolHub - - - "Hub volume" m^3 typedef ^ RotParameterType ReKi HubCenBx - - - "Hub center of buoyancy x direction offset" m typedef ^ RotParameterType ReKi VolNac - - - "Nacelle volume" m^3 typedef ^ RotParameterType ReKi NacCenB 3 - - "Position of nacelle center of buoyancy from yaw bearing in nacelle coordinates" m +typedef ^ RotParameterType ReKi NacArea 3 - - "Projected area of the nacelle in X, Y, Z in the nacelle coordinate system" m^2 +typedef ^ RotParameterType ReKi NacCd 3 - - "Drag cefficient for the nacelle areas defied above" - +typedef ^ RotParameterType ReKi NacDragAC 3 - - "Position of aerodynamic center of nacelle drag in nacelle coordinates" m typedef ^ RotParameterType ReKi VolBl - - - "Buoyancy volume of all blades" m^3 typedef ^ RotParameterType ReKi VolTwr - - - "Buoyancy volume of the tower" m^3 typedef ^ RotParameterType ReKi BlRad {:}{:} - - "Matrix of equivalent blade radius at each node, used in buoyancy calculation" m @@ -421,6 +432,7 @@ typedef ^ RotParameterType LOGICAL TwrAero - - - "Calculate tower aerodynamic lo typedef ^ RotParameterType Integer DBEMT_Mod - - - "DBEMT_Mod" - typedef ^ RotParameterType Logical CavitCheck - - - "Flag that tells us if we want to check for cavitation" - typedef ^ RotParameterType Logical Buoyancy - - - "Include buoyancy effects?" flag +typedef ^ RotParameterType Logical NacelleDrag - - - "Include NacelleDrag effects?" flag typedef ^ RotParameterType IntKi MHK - - - "MHK" flag typedef ^ RotParameterType Logical CompAA - - - "Compute AeroAcoustic noise" flag typedef ^ RotParameterType ReKi AirDens - - - "Air density" kg/m^3 diff --git a/modules/aerodyn/src/AeroDyn_Types.f90 b/modules/aerodyn/src/AeroDyn_Types.f90 index 1a6b8db53b..45739d76a7 100644 --- a/modules/aerodyn/src/AeroDyn_Types.f90 +++ b/modules/aerodyn/src/AeroDyn_Types.f90 @@ -193,6 +193,9 @@ MODULE AeroDyn_Types REAL(ReKi) :: HubCenBx = 0.0_ReKi !< Hub center of buoyancy x direction offset [m] REAL(ReKi) :: VolNac = 0.0_ReKi !< Nacelle volume [m^3] REAL(ReKi) , DIMENSION(1:3) :: NacCenB = 0.0_ReKi !< Position of nacelle center of buoyancy from yaw bearing in nacelle coordinates [m] + REAL(ReKi) , DIMENSION(1:3) :: NacArea = 0.0_ReKi !< Projected area of the nacelle in X, Y, Z in the nacelle coordinate system [m^2] + REAL(ReKi) , DIMENSION(1:3) :: NacCd = 0.0_ReKi !< Drag cefficient for the nacelle areas defied above [-] + REAL(ReKi) , DIMENSION(1:3) :: NacDragAC = 0.0_ReKi !< Position of aerodynamic center of nacelle drag in nacelle coordinates [m] LOGICAL :: TFinAero = .FALSE. !< Calculate tail fin aerodynamics model (flag) [flag] CHARACTER(1024) :: TFinFile !< Input file for tail fin aerodynamics [used only when TFinAero=True] [-] TYPE(TFinInputFileType) :: TFin !< Input file data for tail fin [-] @@ -209,6 +212,7 @@ MODULE AeroDyn_Types LOGICAL :: TwrAero = .false. !< Calculate tower aerodynamic loads? [flag] LOGICAL :: CavitCheck = .false. !< Flag that tells us if we want to check for cavitation [-] LOGICAL :: Buoyancy = .false. !< Include buoyancy effects? [flag] + LOGICAL :: NacelleDrag = .false. !< Include NacelleDrag effects? [flag] LOGICAL :: CompAA = .false. !< Compute AeroAcoustic noise [flag] CHARACTER(1024) :: AA_InputFile !< AeroAcoustics input file name [quoted strings] CHARACTER(1024) , DIMENSION(:), ALLOCATABLE :: ADBlFile !< AD blade file (NumBl filenames) [quoted strings] @@ -356,6 +360,10 @@ MODULE AeroDyn_Types REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: HubMB !< buoyant moment at hub node [Nm] REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: NacFB !< buoyant force at nacelle (tower top) node [N] REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: NacMB !< buoyant moment at nacelle (tower top) node [Nm] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: NacDragF !< drag force at nacelle (tower top) node [N] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: NacDragM !< drag moment at nacelle (tower top) node [Nm] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: NacFi !< Total force at nacelle (tower top) node [N] + REAL(ReKi) , DIMENSION(:), ALLOCATABLE :: NacMi !< Total moment at nacelle (tower top) node [Nm] TYPE(MeshType) , DIMENSION(:), ALLOCATABLE :: BladeRootLoad !< meshes at blade root; used to compute an integral for mapping the output blade loads to single points (for writing to file only) [-] TYPE(MeshMapType) , DIMENSION(:), ALLOCATABLE :: B_L_2_R_P !< mapping data structure to map each bladeLoad output mesh to corresponding MiscVar%BladeRootLoad mesh [-] TYPE(MeshType) , DIMENSION(:), ALLOCATABLE :: BladeBuoyLoadPoint !< point mesh for lumped buoyant blade loads [-] @@ -449,6 +457,9 @@ MODULE AeroDyn_Types REAL(ReKi) :: HubCenBx = 0.0_ReKi !< Hub center of buoyancy x direction offset [m] REAL(ReKi) :: VolNac = 0.0_ReKi !< Nacelle volume [m^3] REAL(ReKi) , DIMENSION(1:3) :: NacCenB = 0.0_ReKi !< Position of nacelle center of buoyancy from yaw bearing in nacelle coordinates [m] + REAL(ReKi) , DIMENSION(1:3) :: NacArea = 0.0_ReKi !< Projected area of the nacelle in X, Y, Z in the nacelle coordinate system [m^2] + REAL(ReKi) , DIMENSION(1:3) :: NacCd = 0.0_ReKi !< Drag cefficient for the nacelle areas defied above [-] + REAL(ReKi) , DIMENSION(1:3) :: NacDragAC = 0.0_ReKi !< Position of aerodynamic center of nacelle drag in nacelle coordinates [m] REAL(ReKi) :: VolBl = 0.0_ReKi !< Buoyancy volume of all blades [m^3] REAL(ReKi) :: VolTwr = 0.0_ReKi !< Buoyancy volume of the tower [m^3] REAL(ReKi) , DIMENSION(:,:), ALLOCATABLE :: BlRad !< Matrix of equivalent blade radius at each node, used in buoyancy calculation [m] @@ -475,6 +486,7 @@ MODULE AeroDyn_Types INTEGER(IntKi) :: DBEMT_Mod = 0_IntKi !< DBEMT_Mod [-] LOGICAL :: CavitCheck = .false. !< Flag that tells us if we want to check for cavitation [-] LOGICAL :: Buoyancy = .false. !< Include buoyancy effects? [flag] + LOGICAL :: NacelleDrag = .false. !< Include NacelleDrag effects? [flag] INTEGER(IntKi) :: MHK = 0_IntKi !< MHK [flag] LOGICAL :: CompAA = .false. !< Compute AeroAcoustic noise [flag] REAL(ReKi) :: AirDens = 0.0_ReKi !< Air density [kg/m^3] @@ -1954,6 +1966,9 @@ subroutine AD_CopyRotInputFile(SrcRotInputFileData, DstRotInputFileData, CtrlCod DstRotInputFileData%HubCenBx = SrcRotInputFileData%HubCenBx DstRotInputFileData%VolNac = SrcRotInputFileData%VolNac DstRotInputFileData%NacCenB = SrcRotInputFileData%NacCenB + DstRotInputFileData%NacArea = SrcRotInputFileData%NacArea + DstRotInputFileData%NacCd = SrcRotInputFileData%NacCd + DstRotInputFileData%NacDragAC = SrcRotInputFileData%NacDragAC DstRotInputFileData%TFinAero = SrcRotInputFileData%TFinAero DstRotInputFileData%TFinFile = SrcRotInputFileData%TFinFile call AD_CopyTFinInputFileType(SrcRotInputFileData%TFin, DstRotInputFileData%TFin, CtrlCode, ErrStat2, ErrMsg2) @@ -2026,6 +2041,9 @@ subroutine AD_PackRotInputFile(RF, Indata) call RegPack(RF, InData%HubCenBx) call RegPack(RF, InData%VolNac) call RegPack(RF, InData%NacCenB) + call RegPack(RF, InData%NacArea) + call RegPack(RF, InData%NacCd) + call RegPack(RF, InData%NacDragAC) call RegPack(RF, InData%TFinAero) call RegPack(RF, InData%TFinFile) call AD_PackTFinInputFileType(RF, InData%TFin) @@ -2064,6 +2082,9 @@ subroutine AD_UnPackRotInputFile(RF, OutData) call RegUnpack(RF, OutData%HubCenBx); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%VolNac); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%NacCenB); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%NacArea); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%NacCd); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%NacDragAC); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%TFinAero); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%TFinFile); if (RegCheckErr(RF, RoutineName)) return call AD_UnpackTFinInputFileType(RF, OutData%TFin) ! TFin @@ -2091,6 +2112,7 @@ subroutine AD_CopyInputFile(SrcInputFileData, DstInputFileData, CtrlCode, ErrSta DstInputFileData%TwrAero = SrcInputFileData%TwrAero DstInputFileData%CavitCheck = SrcInputFileData%CavitCheck DstInputFileData%Buoyancy = SrcInputFileData%Buoyancy + DstInputFileData%NacelleDrag = SrcInputFileData%NacelleDrag DstInputFileData%CompAA = SrcInputFileData%CompAA DstInputFileData%AA_InputFile = SrcInputFileData%AA_InputFile if (allocated(SrcInputFileData%ADBlFile)) then @@ -2255,6 +2277,7 @@ subroutine AD_PackInputFile(RF, Indata) call RegPack(RF, InData%TwrAero) call RegPack(RF, InData%CavitCheck) call RegPack(RF, InData%Buoyancy) + call RegPack(RF, InData%NacelleDrag) call RegPack(RF, InData%CompAA) call RegPack(RF, InData%AA_InputFile) call RegPackAlloc(RF, InData%ADBlFile) @@ -2337,6 +2360,7 @@ subroutine AD_UnPackInputFile(RF, OutData) call RegUnpack(RF, OutData%TwrAero); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%CavitCheck); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%Buoyancy); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%NacelleDrag); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%CompAA); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%AA_InputFile); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%ADBlFile); if (RegCheckErr(RF, RoutineName)) return @@ -3451,6 +3475,54 @@ subroutine AD_CopyRotMiscVarType(SrcRotMiscVarTypeData, DstRotMiscVarTypeData, C end if DstRotMiscVarTypeData%NacMB = SrcRotMiscVarTypeData%NacMB end if + if (allocated(SrcRotMiscVarTypeData%NacDragF)) then + LB(1:1) = lbound(SrcRotMiscVarTypeData%NacDragF, kind=B8Ki) + UB(1:1) = ubound(SrcRotMiscVarTypeData%NacDragF, kind=B8Ki) + if (.not. allocated(DstRotMiscVarTypeData%NacDragF)) then + allocate(DstRotMiscVarTypeData%NacDragF(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstRotMiscVarTypeData%NacDragF.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstRotMiscVarTypeData%NacDragF = SrcRotMiscVarTypeData%NacDragF + end if + if (allocated(SrcRotMiscVarTypeData%NacDragM)) then + LB(1:1) = lbound(SrcRotMiscVarTypeData%NacDragM, kind=B8Ki) + UB(1:1) = ubound(SrcRotMiscVarTypeData%NacDragM, kind=B8Ki) + if (.not. allocated(DstRotMiscVarTypeData%NacDragM)) then + allocate(DstRotMiscVarTypeData%NacDragM(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstRotMiscVarTypeData%NacDragM.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstRotMiscVarTypeData%NacDragM = SrcRotMiscVarTypeData%NacDragM + end if + if (allocated(SrcRotMiscVarTypeData%NacFi)) then + LB(1:1) = lbound(SrcRotMiscVarTypeData%NacFi, kind=B8Ki) + UB(1:1) = ubound(SrcRotMiscVarTypeData%NacFi, kind=B8Ki) + if (.not. allocated(DstRotMiscVarTypeData%NacFi)) then + allocate(DstRotMiscVarTypeData%NacFi(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstRotMiscVarTypeData%NacFi.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstRotMiscVarTypeData%NacFi = SrcRotMiscVarTypeData%NacFi + end if + if (allocated(SrcRotMiscVarTypeData%NacMi)) then + LB(1:1) = lbound(SrcRotMiscVarTypeData%NacMi, kind=B8Ki) + UB(1:1) = ubound(SrcRotMiscVarTypeData%NacMi, kind=B8Ki) + if (.not. allocated(DstRotMiscVarTypeData%NacMi)) then + allocate(DstRotMiscVarTypeData%NacMi(LB(1):UB(1)), stat=ErrStat2) + if (ErrStat2 /= 0) then + call SetErrStat(ErrID_Fatal, 'Error allocating DstRotMiscVarTypeData%NacMi.', ErrStat, ErrMsg, RoutineName) + return + end if + end if + DstRotMiscVarTypeData%NacMi = SrcRotMiscVarTypeData%NacMi + end if if (allocated(SrcRotMiscVarTypeData%BladeRootLoad)) then LB(1:1) = lbound(SrcRotMiscVarTypeData%BladeRootLoad, kind=B8Ki) UB(1:1) = ubound(SrcRotMiscVarTypeData%BladeRootLoad, kind=B8Ki) @@ -3679,6 +3751,18 @@ subroutine AD_DestroyRotMiscVarType(RotMiscVarTypeData, ErrStat, ErrMsg) if (allocated(RotMiscVarTypeData%NacMB)) then deallocate(RotMiscVarTypeData%NacMB) end if + if (allocated(RotMiscVarTypeData%NacDragF)) then + deallocate(RotMiscVarTypeData%NacDragF) + end if + if (allocated(RotMiscVarTypeData%NacDragM)) then + deallocate(RotMiscVarTypeData%NacDragM) + end if + if (allocated(RotMiscVarTypeData%NacFi)) then + deallocate(RotMiscVarTypeData%NacFi) + end if + if (allocated(RotMiscVarTypeData%NacMi)) then + deallocate(RotMiscVarTypeData%NacMi) + end if if (allocated(RotMiscVarTypeData%BladeRootLoad)) then LB(1:1) = lbound(RotMiscVarTypeData%BladeRootLoad, kind=B8Ki) UB(1:1) = ubound(RotMiscVarTypeData%BladeRootLoad, kind=B8Ki) @@ -3792,6 +3876,10 @@ subroutine AD_PackRotMiscVarType(RF, Indata) call RegPackAlloc(RF, InData%HubMB) call RegPackAlloc(RF, InData%NacFB) call RegPackAlloc(RF, InData%NacMB) + call RegPackAlloc(RF, InData%NacDragF) + call RegPackAlloc(RF, InData%NacDragM) + call RegPackAlloc(RF, InData%NacFi) + call RegPackAlloc(RF, InData%NacMi) call RegPack(RF, allocated(InData%BladeRootLoad)) if (allocated(InData%BladeRootLoad)) then call RegPackBounds(RF, 1, lbound(InData%BladeRootLoad, kind=B8Ki), ubound(InData%BladeRootLoad, kind=B8Ki)) @@ -3921,6 +4009,10 @@ subroutine AD_UnPackRotMiscVarType(RF, OutData) call RegUnpackAlloc(RF, OutData%HubMB); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%NacFB); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%NacMB); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%NacDragF); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%NacDragM); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%NacFi); if (RegCheckErr(RF, RoutineName)) return + call RegUnpackAlloc(RF, OutData%NacMi); if (RegCheckErr(RF, RoutineName)) return if (allocated(OutData%BladeRootLoad)) deallocate(OutData%BladeRootLoad) call RegUnpack(RF, IsAllocAssoc); if (RegCheckErr(RF, RoutineName)) return if (IsAllocAssoc) then @@ -4773,6 +4865,9 @@ subroutine AD_CopyRotParameterType(SrcRotParameterTypeData, DstRotParameterTypeD DstRotParameterTypeData%HubCenBx = SrcRotParameterTypeData%HubCenBx DstRotParameterTypeData%VolNac = SrcRotParameterTypeData%VolNac DstRotParameterTypeData%NacCenB = SrcRotParameterTypeData%NacCenB + DstRotParameterTypeData%NacArea = SrcRotParameterTypeData%NacArea + DstRotParameterTypeData%NacCd = SrcRotParameterTypeData%NacCd + DstRotParameterTypeData%NacDragAC = SrcRotParameterTypeData%NacDragAC DstRotParameterTypeData%VolBl = SrcRotParameterTypeData%VolBl DstRotParameterTypeData%VolTwr = SrcRotParameterTypeData%VolTwr if (allocated(SrcRotParameterTypeData%BlRad)) then @@ -4928,6 +5023,7 @@ subroutine AD_CopyRotParameterType(SrcRotParameterTypeData, DstRotParameterTypeD DstRotParameterTypeData%DBEMT_Mod = SrcRotParameterTypeData%DBEMT_Mod DstRotParameterTypeData%CavitCheck = SrcRotParameterTypeData%CavitCheck DstRotParameterTypeData%Buoyancy = SrcRotParameterTypeData%Buoyancy + DstRotParameterTypeData%NacelleDrag = SrcRotParameterTypeData%NacelleDrag DstRotParameterTypeData%MHK = SrcRotParameterTypeData%MHK DstRotParameterTypeData%CompAA = SrcRotParameterTypeData%CompAA DstRotParameterTypeData%AirDens = SrcRotParameterTypeData%AirDens @@ -5118,6 +5214,9 @@ subroutine AD_PackRotParameterType(RF, Indata) call RegPack(RF, InData%HubCenBx) call RegPack(RF, InData%VolNac) call RegPack(RF, InData%NacCenB) + call RegPack(RF, InData%NacArea) + call RegPack(RF, InData%NacCd) + call RegPack(RF, InData%NacDragAC) call RegPack(RF, InData%VolBl) call RegPack(RF, InData%VolTwr) call RegPackAlloc(RF, InData%BlRad) @@ -5144,6 +5243,7 @@ subroutine AD_PackRotParameterType(RF, Indata) call RegPack(RF, InData%DBEMT_Mod) call RegPack(RF, InData%CavitCheck) call RegPack(RF, InData%Buoyancy) + call RegPack(RF, InData%NacelleDrag) call RegPack(RF, InData%MHK) call RegPack(RF, InData%CompAA) call RegPack(RF, InData%AirDens) @@ -5212,6 +5312,9 @@ subroutine AD_UnPackRotParameterType(RF, OutData) call RegUnpack(RF, OutData%HubCenBx); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%VolNac); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%NacCenB); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%NacArea); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%NacCd); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%NacDragAC); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%VolBl); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%VolTwr); if (RegCheckErr(RF, RoutineName)) return call RegUnpackAlloc(RF, OutData%BlRad); if (RegCheckErr(RF, RoutineName)) return @@ -5238,6 +5341,7 @@ subroutine AD_UnPackRotParameterType(RF, OutData) call RegUnpack(RF, OutData%DBEMT_Mod); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%CavitCheck); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%Buoyancy); if (RegCheckErr(RF, RoutineName)) return + call RegUnpack(RF, OutData%NacelleDrag); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%MHK); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%CompAA); if (RegCheckErr(RF, RoutineName)) return call RegUnpack(RF, OutData%AirDens); if (RegCheckErr(RF, RoutineName)) return diff --git a/reg_tests/CTestList.cmake b/reg_tests/CTestList.cmake index 068d6902ab..01f0f91dbe 100644 --- a/reg_tests/CTestList.cmake +++ b/reg_tests/CTestList.cmake @@ -297,6 +297,7 @@ of_regression("SWRT_YFree_VS_EDG01" "openfast;elastodyn;aerod of_regression("SWRT_YFree_VS_EDC01" "openfast;elastodyn;aerodyn15;servodyn") of_regression("SWRT_YFree_VS_WTurb" "openfast;elastodyn;aerodyn15;servodyn") of_regression("5MW_Land_DLL_WTurb" "openfast;elastodyn;aerodyn15;servodyn") +of_regression("5MW_Land_DLL_WTurb_wNacDrag" "openfast;elastodyn;aerodyn15;servodyn") of_regression("5MW_OC3Mnpl_DLL_WTurb_WavesIrr" "openfast;elastodyn;aerodyn15;servodyn;hydrodyn;subdyn;offshore") of_regression("5MW_OC3Mnpl_DLL_WTurb_WavesIrr_Restart" "openfast;elastodyn;aerodyn15;servodyn;hydrodyn;subdyn;offshore;restart") of_regression("5MW_OC3Trpd_DLL_WSt_WavesReg" "openfast;elastodyn;aerodyn15;servodyn;hydrodyn;subdyn;offshore") @@ -313,6 +314,7 @@ of_regression("EllipticalWing_OLAF" "openfast;aerodyn15;olaf" of_regression("StC_test_OC4Semi" "openfast;servodyn;hydrodyn;moordyn;offshore;stc") of_regression("MHK_RM1_Fixed" "openfast;elastodyn;aerodyn15;mhk") of_regression("MHK_RM1_Floating" "openfast;elastodyn;aerodyn15;hydrodyn;moordyn;mhk") +of_regression("MHK_RM1_Floating_wNacDrag" "openfast;elastodyn;aerodyn15;hydrodyn;moordyn;mhk") of_regression("Tailfin_FreeYaw1DOF_PolarBased" "openfast;elastodyn;aerodyn15") of_regression("Tailfin_FreeYaw1DOF_Unsteady" "openfast;elastodyn;aerodyn15") diff --git a/reg_tests/r-test b/reg_tests/r-test index c7359bf3b9..464683353c 160000 --- a/reg_tests/r-test +++ b/reg_tests/r-test @@ -1 +1 @@ -Subproject commit c7359bf3b955c20cf1366bd3daadc2b6ac5ab3e6 +Subproject commit 464683353cbb323f28104cb113824297ef4e2331