@@ -8,6 +8,77 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
88
99## [ Unreleased]
1010
11+ (nothing yet)
12+
13+ ## [ 1.18.0] — 2026-08-13
14+
15+ ### Added
16+
17+ - ** Discrete point masses at any station (#35 ).**
18+ ` Tower.add_point_mass(height, mass) ` attaches a lumped mass anywhere on
19+ the beam, filling the gap between ` outfitting_factor ` (smeared over the
20+ whole tower) and ` tip_mass ` (a single lump at the top) — a flange, an
21+ internal platform, a transformer, a boat-landing. The lump is assembled
22+ through the element shape functions at its exact station, so it does
23+ not have to land on a mesh node and the answer does not move if the
24+ mesh does. Validated against the closed-form cantilever-with-lump
25+ frequency. Its own rotary inertia about its centre is not modelled;
26+ use ` tip_mass ` where that term matters.
27+ - ** Self-weight geometric softening (#134 ).**
28+ ` Tower.run(gravity=True) ` (or ` gravity=9.80665 ` ) puts the weight of the
29+ tower, the RNA and any point masses into the column as an axial load,
30+ which lowers the bending frequencies — typically around 2 % on the 1st
31+ fore-aft mode of a large machine, and usually the single largest term
32+ when reconciling against a tool that models gravity by default. ** Off
33+ by default** , so every existing result is unchanged and the validated
34+ reference cases stay pinned to the BModes-equivalent behaviour. The
35+ geometric stiffness is anchored to two published buckling loads with
36+ different load distributions, Euler tip-load and Greenhill self-weight,
37+ both to 0.2 %. Refused for a free-base floating model, where buoyancy
38+ would have to be netted against the weight, and for the pinned-free
39+ cable BC.
40+ - ** Distributed Winkler soil springs on the monopile path (#118 ).**
41+ ` MudlineFoundation.distributed_springs() ` turns the soil the lumped
42+ mudline springs were built from into a spring rate along the embedded
43+ pile, ` k = D_P E_SO (z / L_P)^n ` with the Shadlou and Bhattacharya
44+ inhomogeneity exponents. `Tower.attach_mudline_foundation(foundation,
45+ distributed=True)` lays it into ` distr_k`, and
46+ ` Tower.from_windio_with_monopile(..., soil_distributed=True) ` keeps the
47+ embedded pile in the beam so it deflects against the soil over its real
48+ length rather than being condensed onto a base spring. Cross-validated
49+ against the lumped tier, which is the exact static condensation of the
50+ same beam and bed: the two agree to 0.4 %, the residual being the
51+ embedded pile's own inertia the condensed form drops.
52+ - ** ` n_nodes ` on the deck and BMI readers (#58 ).** ` Tower ` and
53+ ` RotatingBlade ` gain a ` refine_mesh(n_nodes) ` method and an ` n_nodes `
54+ keyword on every deck constructor — ` Tower(...) ` , ` from_bmi ` ,
55+ ` from_elastodyn ` , ` from_elastodyn_with_subdyn ` ,
56+ ` from_elastodyn_with_mooring ` , ` RotatingBlade(...) ` and its
57+ ` from_elastodyn ` . The geometry constructors already had it, so the
58+ keyword is now uniform across the whole surface. It stays opt-in
59+ because re-gridding a deck re-samples an ** already tabulated** property
60+ table rather than recomputing exact tube properties: a ` UserWarning `
61+ names any deliberate property step the new mesh misses, and a deck with
62+ tension-wire supports is refused outright, since those attach to node
63+ numbers that would silently move.
64+ - ** Domain-aware validation for the civil-structural and geotechnical
65+ disciplines (#102 ).** ` check_model ` gains a fixed-bottom ` D / t ` band —
66+ the support-type-aware tightening of the deliberately wide band
67+ ` tubular_section_props ` applies at construction, which cannot know the
68+ boundary condition and has to admit a floating tower's far thinner
69+ shell. It also reports a monopile clamped rigidly at the mudline with
70+ no soil springs as non-conservative (INFO) and an implausible embedment
71+ ratio ` L / D ` (WARN). New ` check_solved_frequencies ` flags a
72+ fixed-bottom tower whose first mode lands outside 0.01-10 Hz, which is
73+ where a compounding scale error shows up when two inputs are wrong in
74+ compensating directions and each passes its own band; it runs
75+ automatically on ` Tower.run(check_model=True) ` .
76+ - ` CheckOptions ` gains ` diameter_thickness_min ` / ` _max ` and
77+ ` embedment_ratio_min ` / ` _max ` for the new bands.
78+ - ` read_windio_monopile_tower ` gains ` clamp_at_mudline ` , and its result
79+ carries the two reduced segments so a caller can read the raw tube and
80+ material each was built from.
81+
1182### Fixed
1283
1384- ** The dense symmetric eigensolver could return confidently wrong low
@@ -103,75 +174,6 @@ The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
103174 the worsening counts) and ` residual_retry_max_ndof ` (the size above
104175 which the retry is not attempted at all).
105176
106- ## [ 1.18.0] — 2026-08-12
107-
108- ### Added
109-
110- - ** Discrete point masses at any station (#35 ).**
111- ` Tower.add_point_mass(height, mass) ` attaches a lumped mass anywhere on
112- the beam, filling the gap between ` outfitting_factor ` (smeared over the
113- whole tower) and ` tip_mass ` (a single lump at the top) — a flange, an
114- internal platform, a transformer, a boat-landing. The lump is assembled
115- through the element shape functions at its exact station, so it does
116- not have to land on a mesh node and the answer does not move if the
117- mesh does. Validated against the closed-form cantilever-with-lump
118- frequency. Its own rotary inertia about its centre is not modelled;
119- use ` tip_mass ` where that term matters.
120- - ** Self-weight geometric softening (#134 ).**
121- ` Tower.run(gravity=True) ` (or ` gravity=9.80665 ` ) puts the weight of the
122- tower, the RNA and any point masses into the column as an axial load,
123- which lowers the bending frequencies — typically around 2 % on the 1st
124- fore-aft mode of a large machine, and usually the single largest term
125- when reconciling against a tool that models gravity by default. ** Off
126- by default** , so every existing result is unchanged and the validated
127- reference cases stay pinned to the BModes-equivalent behaviour. The
128- geometric stiffness is anchored to two published buckling loads with
129- different load distributions, Euler tip-load and Greenhill self-weight,
130- both to 0.2 %. Refused for a free-base floating model, where buoyancy
131- would have to be netted against the weight, and for the pinned-free
132- cable BC.
133- - ** Distributed Winkler soil springs on the monopile path (#118 ).**
134- ` MudlineFoundation.distributed_springs() ` turns the soil the lumped
135- mudline springs were built from into a spring rate along the embedded
136- pile, ` k = D_P E_SO (z / L_P)^n ` with the Shadlou and Bhattacharya
137- inhomogeneity exponents. `Tower.attach_mudline_foundation(foundation,
138- distributed=True)` lays it into ` distr_k`, and
139- ` Tower.from_windio_with_monopile(..., soil_distributed=True) ` keeps the
140- embedded pile in the beam so it deflects against the soil over its real
141- length rather than being condensed onto a base spring. Cross-validated
142- against the lumped tier, which is the exact static condensation of the
143- same beam and bed: the two agree to 0.4 %, the residual being the
144- embedded pile's own inertia the condensed form drops.
145- - ** ` n_nodes ` on the deck and BMI readers (#58 ).** ` Tower ` and
146- ` RotatingBlade ` gain a ` refine_mesh(n_nodes) ` method and an ` n_nodes `
147- keyword on every deck constructor — ` Tower(...) ` , ` from_bmi ` ,
148- ` from_elastodyn ` , ` from_elastodyn_with_subdyn ` ,
149- ` from_elastodyn_with_mooring ` , ` RotatingBlade(...) ` and its
150- ` from_elastodyn ` . The geometry constructors already had it, so the
151- keyword is now uniform across the whole surface. It stays opt-in
152- because re-gridding a deck re-samples an ** already tabulated** property
153- table rather than recomputing exact tube properties: a ` UserWarning `
154- names any deliberate property step the new mesh misses, and a deck with
155- tension-wire supports is refused outright, since those attach to node
156- numbers that would silently move.
157- - ** Domain-aware validation for the civil-structural and geotechnical
158- disciplines (#102 ).** ` check_model ` gains a fixed-bottom ` D / t ` band —
159- the support-type-aware tightening of the deliberately wide band
160- ` tubular_section_props ` applies at construction, which cannot know the
161- boundary condition and has to admit a floating tower's far thinner
162- shell. It also reports a monopile clamped rigidly at the mudline with
163- no soil springs as non-conservative (INFO) and an implausible embedment
164- ratio ` L / D ` (WARN). New ` check_solved_frequencies ` flags a
165- fixed-bottom tower whose first mode lands outside 0.01-10 Hz, which is
166- where a compounding scale error shows up when two inputs are wrong in
167- compensating directions and each passes its own band; it runs
168- automatically on ` Tower.run(check_model=True) ` .
169- - ` CheckOptions ` gains ` diameter_thickness_min ` / ` _max ` and
170- ` embedment_ratio_min ` / ` _max ` for the new bands.
171- - ` read_windio_monopile_tower ` gains ` clamp_at_mudline ` , and its result
172- carries the two reduced segments so a caller can read the raw tube and
173- material each was built from.
174-
175177## [ 1.17.0] — 2026-07-10
176178
177179### Added
0 commit comments