Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions docs/source/user/hydrodyn/input_files.rst
Original file line number Diff line number Diff line change
Expand Up @@ -715,6 +715,27 @@ Members

Each member in your model will have hydrodynamic coefficients, which are specified using one of the three models (**MCoefMod**). Model 1 uses a single set of coefficients found in the SIMPLE HYDRODYNAMIC COEFFICIENTS sections. Model 2 is depth-based, and is determined via the table found in the DEPTH-BASED HYDRODYNAMIC COEFFICIENTS sections. Model 3 specifies coefficients for a particular member, by referring to the MEMBER-BASED HYDRODYNAMIC COEFFICIENTS sections. Depending on **MSecGeom**, HydroDyn will either use the hydrodynamic coefficients from the input tables for circular sections or rectangular sections as appropriate. The **MHstLMod** switch controls the computation of hydrostatic loads on strip-theory members when **PropPot** = FALSE. Setting **MHstLMod** to 0 disables hydrostatic load. If set to 1, hydrostatic loads will be computed analytically. This approach is efficient, but it only works for fully submerged or surface-piercing members that are far from horizontal without partially wetted endplates. For nearly horizontal members close to the free surface or members that experience partially wetted endplates, a semi-numerical approach for hydrostatic load can be selected by setting **MHstLMod** to 2. This approach works with any member positioning in relation to the free surface at the cost of slightly longer computing time. Note that for members with rectangular cross sections, **MHstLMod** must be either 0 or 2. The analytical approach with **MHstLMod** set to 1 is not available for rectangular members. The **PropPot** flag indicates whether the corresponding member is included in the potential-flow solution. When **PropPot** = TRUE, only viscous-drag loads and ballasting loads will be computed for that member, with the assumption that all other load components are already included in the potential-flow solution.

In addition to the required inputs for each member explained above, we have several optional inputs for more advanced transverse drag modeling for rectangular members. These are **FDMod**, **VnCOffA**, **VnCOffB**, **FDLoFScA**, and **FDLoFScB**, as shown in the example below. For each rectangular member (**MSecGeom** = 2), users can either omit all these optional inputs together, in which case the simple default drag formulation will be used, or provide all five optional inputs to enable more advanced drag formulation. It is not allowed to provide only a subset of these optional inputs, while omitting others. These inputs are not relevant to members with circular cross sections (**MSecGeom** = 1) and should be omitted for these members. HydroDyn will simply ignore these optional inputs if provided for a circular member, and a warning will be displayed at the start of the simulation.

The first optional input **FDMod** can be 0, 1, or 2. Setting **FDMod** to 0 leads to the default transverse drag formulation for rectangular members. The two components of the distributed transverse drag force normal to Side A and normal to Side B are both computed using the flow and structure velocities along the axis/centerline of the member based on **CdA** and **CdB** defined previously. This is referred to as a centerline-based formulation. Consistent with the transverse drag along cylindrical members, a lead coefficient of 1/2 is used in the expression for the drag force in both directions.

When **FDMod** is set to 1, a face-based drag formulation is used. In this case, four side-normal drag components are computed using the flow and structure velocities at the midpoints of the four sides of the rectangular section instead of at the center. On each side, only the normal components of the flow and structure velocities are used to compute the drag force. The components parallel to the side are ignored. This is analogous to the modeling of drag force on member endplates at the joints with **AxFDMod** set to 0, if we interpret each of the four side walls of a rectangular member as an array of endplates placed along the length of the member. Also analogous to endplate drag force, a lead coefficient of 1/4 instead of 1/2 is used when computing the drag force on each side. This is to account for the fact that we now have two drag components on the pair of sides normal to Side A and two drag components on the other pair of sides normal to Side B. This change in the lead coefficient ensures a degree of consistency with the default model of **FDMod** = 0.

Setting **FDMod** to 2 also leads to a face-based drag formulation being used. However, drag force will only be applied on the sides where the relative flow is directed away from the structure, i.e., the suction side, where flow separation is expected, not on the sides the relative flow is impinging on where flow separation is unlikely. This is again analogous to the modeling of endplate drag force at the joints with **AxFDMod** set to 1. This suction-side-only formulation is expected to work better for hybrid members modeled by potential-flow theory. Note that with **FDMod** set to 2, a lead coefficient of 1/2 instead of 1/4 is again used for each side. This is because for each pair of parallel sides, typically only one side, the suction side, will have a non-zero drag force, not both. This change in the lead coefficient is again included to ensure a degree of consistency with the other two drag formulations.

With **FDMod** set to either 1 or 2, users can optional enable high-pass filtering of the relative flow velocity when computing the transverse drag force. The cutoff frequency of the high-pass filter can be set through **VnCOffA** for the drag components normal to Side A and **VnCOffB** for the drag components normal to Side B. These inputs are analogous to **AxVnCOff** for the endplate drag force at the joints. The two weighting factors **FDLoFScA** for the drag components normal to Side A and **FDLoFScB** for the drag components normal to Side B control the proportion of drag force computed using the unfiltered relative flow velocity. Both inputs should be between 0 and 1. When set to 1, the drag force is computed purely based on the unfiltered relative flow velocity, equivalent to no velocity filtering. When set to 0, the drag force is computed purely based on the high-pass filtered relative flow velocity. Again, these inputs are analogous to **AxFDLoFSc** for the member endplate drag forces at the joints. The velocity filtering allows the user to attenuate the drag force in response to low-frequency motion. When applied to the drag force on rectangular pontoons, this option can help improve the predictions of low-frequency heave and pitch resonance motions of a floater if properly tuned. To disable velocity filtering, users can either set **FDLoFScA** and **FDLoFScB** to 1 or set **VnCOffA** and **VnCOffB** to a number equal to or less than zero. Velocity filtering is not supported with the centerline-based approach, and the relevant inputs will be ignored if **FDMod** = 0.

If the optional inputs are omitted for a rectangular member, the default centerline-based drag formulation with **FDMod** = 0 will be used, and velocity filtering will not be applied. Irrespective of the choice of **FDMod** and velocity filtering, the member drag coefficients can be set using any of the three **MCoefMod** options without any additional restrictions. Finally, note that these optional inputs only affect the computation of distributed transverse drag forces perpendicular to the member axis. They do not affect the distributed axial drag force along the member axis.

.. code::

-------------------- MEMBERS -------------------------------------------------
2 NMembers - Number of members (-)
MemberID MJointID1 MJointID2 MPropSetID1 MPropSetID2 MSecGeom MSpinOrient MDivSize MCoefMod MHstLMod PropPot FDMod VnCOffA VnCOffB FDLoFScA FDLoFScB [MCoefMod=1: use simple coeff table, 2: use depth-based coeff table, 3: use member-based coeff table] [PropPot/=0 if member is modeled with potential-flow theory]
(-) (-) (-) (-) (-) (switch) (deg) (m) (switch) (switch) (flag) (switch) (Hz) (Hz) (-) (-)
1 1 2 1 1 1 0 0.5 1 2 FALSE ! Circular members should not have any optional inputs. If provided, these inputs will be ignored.
2 3 4 1 2 2 60 0.5 2 2 FALSE 2 0.05 0.05 0.5 0.5 ! A rectangular member with optional inputs for drag.

.. TODO 7.5.2 is the theory section which does not yet exist.
.. Section 7.5.2 discusses the difference between the user-supplied discretization and the simulation discretization.

Expand Down
63 changes: 56 additions & 7 deletions modules/hydrodyn/src/HydroDyn_Input.f90
Original file line number Diff line number Diff line change
Expand Up @@ -915,18 +915,51 @@ SUBROUTINE HydroDyn_ParseInput( InputFileName, OutRootName, FileInfo_In, InputFi
DO I = 1,InputFileData%Morison%NMembers
! We can't use the ParseAry here since PropPot is a logical
Line = FileInfo_In%Lines(CurLine)

READ(Line,*,IOSTAT=ErrStat2) InputFileData%Morison%InpMembers(I)%MemberID, InputFileData%Morison%InpMembers(I)%MJointID1, &
InputFileData%Morison%InpMembers(I)%MJointID2, InputFileData%Morison%InpMembers(I)%MPropSetID1, &
InputFileData%Morison%InpMembers(I)%MPropSetID2, InputFileData%Morison%InpMembers(I)%MSecGeom, &
InputFileData%Morison%InpMembers(I)%MSpinOrient, InputFileData%Morison%InpMembers(I)%MDivSize, &
InputFileData%Morison%InpMembers(I)%MCoefMod, InputFileData%Morison%InpMembers(I)%MHstLMod, &
InputFileData%Morison%InpMembers(I)%PropPot
InputFileData%Morison%InpMembers(I)%PropPot, InputFileData%Morison%InpMembers(I)%FDMod, &
InputFileData%Morison%InpMembers(I)%VnCOffA, InputFileData%Morison%InpMembers(I)%VnCOffB, &
InputFileData%Morison%InpMembers(I)%FDLoFScA, InputFileData%Morison%InpMembers(I)%FDLoFScB
IF ( ErrStat2 /= 0 ) THEN
ErrStat2 = ErrID_Fatal
ErrMsg2 = 'Error reading members table row '//trim( Int2LStr(I))//', line ' &
//trim( Int2LStr(FileInfo_In%FileLine(CurLine)))//' of file '//trim(FileInfo_In%FileList(FileInfo_In%FileIndx(CurLine)))
if (Failed()) return;
READ(Line,*,IOSTAT=ErrStat2) InputFileData%Morison%InpMembers(I)%MemberID, InputFileData%Morison%InpMembers(I)%MJointID1, &
InputFileData%Morison%InpMembers(I)%MJointID2, InputFileData%Morison%InpMembers(I)%MPropSetID1, &
InputFileData%Morison%InpMembers(I)%MPropSetID2, InputFileData%Morison%InpMembers(I)%MSecGeom, &
InputFileData%Morison%InpMembers(I)%MSpinOrient, InputFileData%Morison%InpMembers(I)%MDivSize, &
InputFileData%Morison%InpMembers(I)%MCoefMod, InputFileData%Morison%InpMembers(I)%MHstLMod, &
InputFileData%Morison%InpMembers(I)%PropPot
IF ( ErrStat2 /= 0 ) THEN
ErrStat2 = ErrID_Fatal
ErrMsg2 = 'Error reading members table row '//trim( Int2LStr(I))//', line ' &
//trim( Int2LStr(FileInfo_In%FileLine(CurLine)))//' of file '//trim(FileInfo_In%FileList(FileInfo_In%FileIndx(CurLine)))
if (Failed()) return;
ELSE
InputFileData%Morison%InpMembers(I)%FDMod = 0_IntKi
InputFileData%Morison%InpMembers(I)%VnCOffA = -1.0_ReKi
InputFileData%Morison%InpMembers(I)%VnCOffB = -1.0_ReKi
InputFileData%Morison%InpMembers(I)%FDLoFScA = 1.0_ReKi
InputFileData%Morison%InpMembers(I)%FDLoFScB = 1.0_ReKi
END IF
ELSE
IF ( InputFileData%Morison%InpMembers(I)%MSecGeom /= MSecGeom_Rec ) THEN
call WrScr('HydroDyn Warning: The optional member inputs FDMod, VnCOffA, VnCOffB, FDLoFScA, and FDLoFScB are only applicable to members with rectangular sections. These will be ignored for Member ID '//TRIM(num2Lstr(InputFileData%Morison%InpMembers(I)%MemberID))//'. ')
InputFileData%Morison%InpMembers(I)%FDMod = 0_IntKi
InputFileData%Morison%InpMembers(I)%VnCOffA = -1.0_ReKi
InputFileData%Morison%InpMembers(I)%VnCOffB = -1.0_ReKi
InputFileData%Morison%InpMembers(I)%FDLoFScA = 1.0_ReKi
InputFileData%Morison%InpMembers(I)%FDLoFScB = 1.0_ReKi
ELSE IF ( InputFileData%Morison%InpMembers(I)%FDMod == 0_IntKi ) THEN
call WrScr('HydroDyn Warning: Velocity filtering for rectangular-member transverse drag force is only available with FDMod = 1 or 2. The optional member inputs VnCOffA, VnCOffB, FDLoFScA, and FDLoFScB will be ignored for Member ID '//TRIM(num2Lstr(InputFileData%Morison%InpMembers(I)%MemberID))//'. ')
InputFileData%Morison%InpMembers(I)%VnCOffA = -1.0_ReKi
InputFileData%Morison%InpMembers(I)%VnCOffB = -1.0_ReKi
InputFileData%Morison%InpMembers(I)%FDLoFScA = 1.0_ReKi
InputFileData%Morison%InpMembers(I)%FDLoFScB = 1.0_ReKi
END IF
END IF

InputFileData%Morison%InpMembers(I)%MSpinOrient = InputFileData%Morison%InpMembers(I)%MSpinOrient * D2R

if ( InputFileData%Echo ) WRITE(UnEc, '(A)') trim(FileInfo_In%Lines(CurLine)) ! Echo this line
Expand Down Expand Up @@ -2482,8 +2515,8 @@ SUBROUTINE HydroDynInput_ProcessInitData( InitInp, Interval, InputFileData, ErrS
RETURN
END IF

IF ( InputFileData%Morison%InpMembers(I)%MSecGeom == MSecGeom_Rec .AND. InputFileData%Morison%InpMembers(I)%MHstLMod /= 2 ) THEN
CALL SetErrStat( ErrID_Fatal,'MHstLMod must be 2 for rectangular members.',ErrStat,ErrMsg,RoutineName)
IF ( InputFileData%Morison%InpMembers(I)%MSecGeom == MSecGeom_Rec .AND. InputFileData%Morison%InpMembers(I)%MHstLMod /= 0 .AND. InputFileData%Morison%InpMembers(I)%MHstLMod /= 2 ) THEN
CALL SetErrStat( ErrID_Fatal,'MHstLMod must be 0 or 2 for rectangular members.',ErrStat,ErrMsg,RoutineName)
RETURN
END IF

Expand All @@ -2492,6 +2525,22 @@ SUBROUTINE HydroDynInput_ProcessInitData( InitInp, Interval, InputFileData, ErrS
RETURN
END IF

! Optional member inputs for rectangular members
IF ( InputFileData%Morison%InpMembers(I)%FDMod /= 0_IntKi .AND. InputFileData%Morison%InpMembers(I)%FDMod /= 1_IntKi .AND. InputFileData%Morison%InpMembers(I)%FDMod /= 2_IntKi ) THEN
CALL SetErrStat( ErrID_Fatal,'FDMod must be 0 (centerline-based drag), 1 (face-based drag), or 2 (face-based suction-side-only drag) for rectangular members.',ErrStat,ErrMsg,RoutineName)
RETURN
END IF

IF ( InputFileData%Morison%InpMembers(I)%FDLoFScA < 0.0_ReKi .OR. InputFileData%Morison%InpMembers(I)%FDLoFScA > 1.0_ReKi ) THEN
CALL SetErrStat( ErrID_Fatal,'FDLoFScA and FDLoFScB for rectangular members must be between 0 and 1 inclusive.',ErrStat,ErrMsg,RoutineName)
RETURN
END IF

IF ( InputFileData%Morison%InpMembers(I)%FDLoFScB < 0.0_ReKi .OR. InputFileData%Morison%InpMembers(I)%FDLoFScB > 1.0_ReKi ) THEN
CALL SetErrStat( ErrID_Fatal,'FDLoFScA and FDLoFScB for rectangular members must be between 0 and 1 inclusive.',ErrStat,ErrMsg,RoutineName)
RETURN
END IF

END DO

END IF
Expand Down
Loading