Skip to content

Commit ba96c1a

Browse files
authored
Merge pull request #143 from SMI-Lab-Inha/fix/hydrodyn-filled-ballast
fix: lump HydroDyn filled-member ballast into deck-built floating platforms
2 parents 53fc2b0 + ab0f561 commit ba96c1a

24 files changed

Lines changed: 995 additions & 77 deletions

File tree

‎CHANGELOG.md‎

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -81,11 +81,33 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
8181
`Tower.run` on a free-free floating model now warns (`UserWarning`)
8282
when `hydro_K + mooring_K` has a negative direction, naming the
8383
dominant DOFs: the platform is statically unstable there and the
84-
general solver leaves those modes out of the result. The bundled
85-
`08_nrel5mw_oc4semi` sample triggers it — the OC4 DeepCwind deck keeps
86-
its ballast in HydroDyn filled members rather than `PtfmMass`, which
87-
the platform model does not include, so its roll / pitch restoring is
88-
negative and the modes labelled roll / pitch there are tower bending.
84+
general solver leaves those modes out of the result.
85+
- **Ballast held in HydroDyn filled members was missing from floating
86+
models.** Some decks keep their water ballast out of ElastoDyn's
87+
`PtfmMass` and declare it as HydroDyn filled-member groups, which
88+
OpenFAST applies through HydroDyn at run time. The OC4 DeepCwind semi
89+
is the standard case, with 3.852e6 kg of steel in `PtfmMass` and
90+
9.62e6 kg of water in two fill groups. `Tower.from_elastodyn_with_mooring`
91+
and the deck-backed tier of `Tower.from_windio_floating` now read the
92+
joints, cross-sections, members and fill groups of the HydroDyn deck
93+
and lump the fill into the platform as the rigid, body-fixed ballast
94+
HydroDyn models it as: mass, centre of mass and full 3×3 inertia about
95+
the combined centre of mass. On OC4 this gives 1.3476e7 kg with the
96+
centre of mass 13.460 m below MSL, against 1.3473e7 kg and 13.46 m in
97+
Robertson et al. (2014), NREL/TP-5000-60601. Roll / pitch restoring
98+
goes from −3.8e8 to +9.85e8 N·m/rad and all six rigid-body modes come
99+
back (surge / sway 0.0088, heave 0.0579, roll / pitch 0.0390, yaw
100+
0.0125 Hz); before, the modes labelled roll and pitch were tower
101+
bending. Decks without fill groups are unaffected. Only cylindrical
102+
filled members are supported; a rectangular one raises
103+
`NotImplementedError` rather than being skipped.
104+
- **Bundled floating samples regenerated.** `08_nrel5mw_oc4semi` now
105+
carries the ballasted platform above (its first tower FA mode moves
106+
from 0.4507 to 0.4284 Hz), and `09_iea15_umainesemi`,
107+
`10_iea22_semi` and `11_upscale25_centraltower` now include the weight
108+
restoring in `hydro_K` (roll / pitch +3.4e8, +1.3e7 and −1.4e9
109+
N·m/rad; all stay positive). Every sample README picks up the
110+
corrected dense-solver frequencies.
89111
- **`Tower.add_point_mass` on a deck-built floater now updates the
90112
weight restoring.** The weight term is formed when the model is
91113
constructed, so a lump added afterwards reached the FEM mass matrix but

‎VALIDATION.md‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,7 @@ by title + publisher:
129129
- Jonkman, Butterfield, Musial & Scott (2009). *Definition of a 5-MW Reference Wind Turbine for Offshore System Development*. NREL/TP-500-38060. [PDF](https://docs.nrel.gov/docs/fy09osti/38060.pdf).
130130
- Jonkman & Musial (2010). *Offshore Code Comparison Collaboration (OC3) for IEA Wind Task 23*. NREL/TP-5000-48191. [PDF](https://docs.nrel.gov/docs/fy11osti/48191.pdf).
131131
- Jonkman (2010). *Definition of the Floating System for Phase IV of OC3*. NREL/TP-500-47535. [PDF](https://docs.nrel.gov/docs/fy10osti/47535.pdf).
132+
- Robertson, Jonkman, Masciola, Song, Goupee, Coulling & Luan (2014). *Definition of the Semisubmersible Floating System for Phase II of OC4*. NREL/TP-5000-60601. [PDF](https://docs.nrel.gov/docs/fy14osti/60601.pdf).
132133
- Bortolotti, Tarrés, Dykes, Merz, Sethuraman, Verelst & Zahle (2019). *IEA Wind TCP Task 37: Systems Engineering in Wind Energy — WP2.1 Reference Wind Turbines*. NREL/TP-5000-73492. [PDF](https://docs.nrel.gov/docs/fy19osti/73492.pdf).
133134
- Gaertner et al. (2020). *IEA Wind TCP Task 37: Definition of the IEA 15-Megawatt Offshore Reference Wind Turbine*. NREL/TP-5000-75698. [PDF](https://docs.nrel.gov/docs/fy20osti/75698.pdf).
134135
- Allen et al. (2020). *Definition of the UMaine VolturnUS-S Reference Platform Developed for the IEA Wind 15-Megawatt Offshore Reference Wind Turbine*. NREL/TP-5000-76773. [PDF](https://docs.nrel.gov/docs/fy20osti/76773.pdf).
@@ -230,6 +231,9 @@ is behavioural / contract-style.
230231
| Floating weight restoring $-g \sum m_i (z_i - z_{ref})$ in roll / pitch (platform + tower + RNA) | closed form; classical $C_{44} = \rho g V (z_B - z_G) + \rho g I_{wp}$ (Faltinsen 1990, ch. 2) | 6×6 weight matrix, reference-point shift, mass scaling, point masses | `rel = 1e-9` | exact | [`tests/test_floating_weight_restoring.py`](https://github.com/SMI-Lab-Inha/pyBModes/blob/master/tests/test_floating_weight_restoring.py) | no |
231232
| Negative platform restoring is reported, not silently dropped | construction (OC3 Hywind sample with the weight term removed) | `UserWarning` naming roll / pitch | always | (within tol) | [`tests/test_floating_weight_restoring.py`](https://github.com/SMI-Lab-Inha/pyBModes/blob/master/tests/test_floating_weight_restoring.py) | no |
232233
| **`Tower.from_elastodyn_with_mooring` — OC3 Hywind rigid-body frequencies** (WAMIT `.hst` + weight of platform, tower and RNA) | Jonkman (2010) NREL/TP-500-47535, FAST full-system natural frequencies: surge/sway 0.0080, heave 0.0324, roll 0.0342, pitch 0.0343 Hz | six labelled rigid-body modes | surge/sway/roll/pitch 3 %, heave 2 % | surge/sway 0.8 %, heave 0.0 %, roll 1.1 %, pitch 1.4 % (roll/pitch were missing before the weight term) | [`tests/test_floating_weight_restoring.py`](https://github.com/SMI-Lab-Inha/pyBModes/blob/master/tests/test_floating_weight_restoring.py) | yes |
234+
| HydroDyn filled-member ballast mass properties (body-fixed, as HydroDyn precomputes them) | closed form: solid cylinder, frustum volume / centroid / axial moment, parallel axis | mass, centre of mass, 3×3 inertia; partial / full / empty, horizontal, inclined, tapered members; both member-table layouts | `rel = 1e-12` | exact | [`tests/test_hydrodyn_ballast.py`](https://github.com/SMI-Lab-Inha/pyBModes/blob/master/tests/test_hydrodyn_ballast.py) | no |
235+
| **`Tower.from_elastodyn_with_mooring` — OC4 DeepCwind ballasted platform** (steel `PtfmMass` + two HydroDyn fill groups) | Robertson et al. (2014) NREL/TP-5000-60601: platform incl. ballast 1.3473e7 kg, CM 13.46 m below SWL | platform mass, CM depth; positive roll / pitch restoring; six labelled rigid-body modes; heave vs single-DOF estimate | mass `rel = 1e-3`, CM `abs = 0.01 m`, heave `rel = 2%` | mass +0.02 %, CM 0.000 m | [`tests/test_hydrodyn_ballast.py`](https://github.com/SMI-Lab-Inha/pyBModes/blob/master/tests/test_hydrodyn_ballast.py) | yes |
236+
| Bundled floating samples are statically stable | construction (samples 07-11) | six labelled rigid-body modes, no negative-restoring warning | always | (within tol) | [`tests/test_floating_samples_spectra.py`](https://github.com/SMI-Lab-Inha/pyBModes/blob/master/tests/test_floating_samples_spectra.py) | no |
233237
| `MudlineFoundation.from_soil_properties` — Yu & Amdahl (2023) Table 9 DTU 10 MW flexible pile, E\_SO = 30 MPa | Yu and Amdahl (2023) Marine Structures 92, 103482, Table 9 row 2 | K\_hh, K\_hr, K\_rr via Shadlou and Bhattacharya (2016) formulas | `rel = 10%` | within 3.0 % on all three springs | [`tests/test_foundation.py`](https://github.com/SMI-Lab-Inha/pyBModes/blob/master/tests/test_foundation.py) | no |
234238
| `MudlineFoundation.from_soil_properties` — Yu & Amdahl (2023) Table 9 DTU 10 MW rigid pile, E\_SO = 30 MPa | Yu and Amdahl (2023) Table 9 row 1 | K\_hh, K\_hr, K\_rr via Shadlou and Bhattacharya (2016) rigid-pile formulas | `rel = 5%` | within 2.9 % on all three springs | [`tests/test_foundation.py`](https://github.com/SMI-Lab-Inha/pyBModes/blob/master/tests/test_foundation.py) | no |
235239
| `MudlineFoundation.as_mooring_K` — cross-coupling sign matches Jonkman 2010 OC3 convention | construction | K\[0,4\] < 0, K\[1,3\] > 0, K\[0,4\]·K\[1,3\] < 0 | always | (within tol) | [`tests/test_foundation.py`](https://github.com/SMI-Lab-Inha/pyBModes/blob/master/tests/test_foundation.py) | no |

‎docs/conventions.rst‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -299,6 +299,12 @@ Common pitfalls
299299
a ballast-stabilised spar is negative in roll / pitch (OC3 Hywind:
300300
``−5.0e9 N·m/rad``), and ``Tower.run`` warns that those rigid-body
301301
modes are unstable rather than returning them.
302+
* **Leaving out ballast declared in HydroDyn.** Water ballast given as
303+
HydroDyn filled-member groups is not in ElastoDyn's ``PtfmMass``
304+
(OC4 DeepCwind keeps all of it there). The deck constructors lump it
305+
into ``mass_pform``, ``cm_pform`` and ``i_matrix`` as the rigid ballast
306+
HydroDyn treats it as; a hand-built ``PlatformSupport`` has to include
307+
it itself.
302308

303309
* **Confusing OpenFAST's two frames.** ``PtfmCMzt`` (CM) and
304310
``PtfmRefzt`` (reference) are both in the tower-base *t*-frame;

‎src/pybmodes/_examples/sample_inputs/reference_turbines/01_nrel5mw_land/README.md‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,13 @@ This sample is a cantilever (`hub_conn = 1`) clamped at TowerBsHt with the RNA l
3333

3434
### Tower
3535

36-
- 1st FA tower-bending: **0.3332 Hz**
36+
- 1st FA tower-bending: **0.3304 Hz**
3737

3838
### Blade (spinning at deck `RotSpeed = 12.1 rpm`)
3939

40-
- 1st flap: **0.7343 Hz**
41-
- 1st edge: **1.1083 Hz**
42-
- 2nd flap: **2.0177 Hz**
40+
- 1st flap: **0.7342 Hz**
41+
- 1st edge: **1.1080 Hz**
42+
- 2nd flap: **2.0175 Hz**
4343

4444
## Comparison with published values
4545

‎src/pybmodes/_examples/sample_inputs/reference_turbines/02_nrel5mw_oc3monopile/README.md‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,13 @@ This sample is a combined pile + tower cantilever (`hub_conn = 1`) clamped at th
3333

3434
### Tower
3535

36-
- 1st FA tower-bending: **0.2856 Hz**
36+
- 1st FA tower-bending: **0.2869 Hz**
3737

3838
### Blade (spinning at deck `RotSpeed = 12.1 rpm`)
3939

40-
- 1st flap: **0.7343 Hz**
41-
- 1st edge: **1.1083 Hz**
42-
- 2nd flap: **2.0177 Hz**
40+
- 1st flap: **0.7342 Hz**
41+
- 1st edge: **1.1080 Hz**
42+
- 2nd flap: **2.0175 Hz**
4343

4444
## Comparison with published values
4545

‎src/pybmodes/_examples/sample_inputs/reference_turbines/03_iea34_land/README.md‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,13 @@ This sample is a cantilever (`hub_conn = 1`) clamped at TowerBsHt with the RNA l
3333

3434
### Tower
3535

36-
- 1st FA tower-bending: **0.4172 Hz**
36+
- 1st FA tower-bending: **0.4179 Hz**
3737

3838
### Blade (spinning at deck `RotSpeed = 5 rpm`)
3939

40-
- 1st flap: **0.7958 Hz**
41-
- 1st edge: **1.0294 Hz**
42-
- 2nd flap: **2.3593 Hz**
40+
- 1st flap: **0.7960 Hz**
41+
- 1st edge: **1.0296 Hz**
42+
- 2nd flap: **2.3592 Hz**
4343

4444
## Comparison with published values
4545

‎src/pybmodes/_examples/sample_inputs/reference_turbines/04_iea10_monopile/README.md‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,13 @@ This sample is a combined pile + tower cantilever (`hub_conn = 1`) clamped at th
3333

3434
### Tower
3535

36-
- 1st FA tower-bending: **0.3008 Hz**
36+
- 1st FA tower-bending: **0.3000 Hz**
3737

3838
### Blade (spinning at deck `RotSpeed = 5 rpm`)
3939

40-
- 1st flap: **0.4044 Hz**
41-
- 1st edge: **0.6496 Hz**
42-
- 2nd flap: **1.0430 Hz**
40+
- 1st flap: **0.4050 Hz**
41+
- 1st edge: **0.6494 Hz**
42+
- 2nd flap: **1.0433 Hz**
4343

4444
## Comparison with published values
4545

‎src/pybmodes/_examples/sample_inputs/reference_turbines/05_iea15_monopile/README.md‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,13 @@ This sample is a combined pile + tower cantilever (`hub_conn = 1`) clamped at th
3333

3434
### Tower
3535

36-
- 1st FA tower-bending: **0.1906 Hz**
36+
- 1st FA tower-bending: **0.1883 Hz**
3737

3838
### Blade (spinning at deck `RotSpeed = 7.55 rpm`)
3939

40-
- 1st flap: **0.5583 Hz**
41-
- 1st edge: **0.7278 Hz**
42-
- 2nd flap: **1.5915 Hz**
40+
- 1st flap: **0.5585 Hz**
41+
- 1st edge: **0.7281 Hz**
42+
- 2nd flap: **1.5916 Hz**
4343

4444
## Comparison with published values
4545

‎src/pybmodes/_examples/sample_inputs/reference_turbines/06_iea22_monopile/README.md‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,13 @@ This sample is a combined pile + tower cantilever (`hub_conn = 1`) clamped at th
3333

3434
### Tower
3535

36-
- 1st FA tower-bending: **0.1819 Hz**
36+
- 1st FA tower-bending: **0.1701 Hz**
3737

3838
### Blade (spinning at deck `RotSpeed = 3 rpm`)
3939

40-
- 1st flap: **0.3998 Hz**
41-
- 1st edge: **0.5381 Hz**
42-
- 2nd flap: **1.1032 Hz**
40+
- 1st flap: **0.3987 Hz**
41+
- 1st edge: **0.5388 Hz**
42+
- 2nd flap: **1.1031 Hz**
4343

4444
## Comparison with published values
4545

‎src/pybmodes/_examples/sample_inputs/reference_turbines/07_nrel5mw_oc3hywind_spar/README.md‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,9 @@ This sample is a free-free flexible-tower (`hub_conn = 2`) with a full PlatformS
3737

3838
### Blade (spinning at deck `RotSpeed = 12.1 rpm`)
3939

40-
- 1st flap: **0.7343 Hz**
41-
- 1st edge: **1.1083 Hz**
42-
- 2nd flap: **2.0177 Hz**
40+
- 1st flap: **0.7342 Hz**
41+
- 1st edge: **1.1080 Hz**
42+
- 2nd flap: **2.0175 Hz**
4343

4444
## Comparison with published values
4545

0 commit comments

Comments
 (0)