|
FhSim
3.1.0
Marine systems simulation
|
The morenot520 bottom trawl of data/trawl/movies/trawl/morenot520/ towed at 4 kn until it settles, under fhsim_marine_elements 4.0 (both net load laws) and 3.2.1. The figures are information, not pass/fail: there are no measurements of this trawl. The test SteadyTow_VALIDATION checks that the tow is statistically stationary below the warps' MaxTension (§ 1.2): a trawl can run in a genuine cycle, so "settled" means that the mean and the range of each quantity have stopped changing, not that the quantity is constant. Issues: FISH-0079 and FISH-0080 (both resolved, issues/resolved/FISH-0079-steady-tow-trawl-scenario.md, issues/resolved/FISH-0080-morenot520-net-acceleration-limit.md). Run on 2026-09-27. § 6 repeats the tow at 3.0, 3.5, 4.0 and 4.5 kn under both 4.0 laws and 3.2.1 (speed sweep, owner ruling R40).
Mean over 350–450 s. The run starts at rest, ramps the vessel to 2.058 m/s over 120 s and is settled from about 250 s: every mean below changes by less than 0.3 % between 250–350 s and 350–450 s. The loads carry a fast oscillation; "sd" is its standard deviation in the 1 s samples (from a scratch run of the same input).
| Quantity | 4.0, LocalThroughFlow (default) | 4.0, TwineCrossFlow | 3.2.1 |
|---|---|---|---|
| Net drag (x-sum of the six bridle forces on the wing nodes) | 90.3 kN (sd 5.6) | 114.0 kN (sd 11.3) | 130.8 kN (sd 9.5) |
| Sum of both warp tensions at the vessel | 184.0 kN (sd 6.8) | 203.2 kN (sd 16.7) | 216.7 kN (sd 12.5) |
Largest warp end tension over the whole run (MaxTension 1000 kN) | 110 kN | 122 kN | 121 kN |
| Door spread (warp attachment points) | 104.4 m | 83.2 m | 74.3 m |
Wing spread (upper wing ends PWing1–SWing1) | 32.8 m | 26.4 m | 23.2 m |
| Headline height (fishline centre below headline centre) | 6.79 m | 8.79 m | 9.48 m |
| Door depth (seabed at 190 m) | 188.5 m | 188.4 m | 188.3 m |
Against 3.2.1 the default law gives 31 % less net drag and TwineCrossFlow 13 % less. The doors and the net lie on the seabed (fishline centre at 190.2 m, codend at 188.4 m), so the net drag includes the seabed contact force of the groundgear, as a load cell ahead of the wing ends would measure it at sea.
The 4.0 columns are the two SteadyTow_VALIDATION runs of the committed inputs (fishery wp/I1-steady-tow, fhsim_marine_elements integration branch e841c70, whose src/ equals bdca9d8). The 3.2.1 column is the same input run in a scratch copy on fishery main ff17183 with fhsim_marine_elements 3.2.1 from the Conan cache (the build of WP-D3).
Rerun after FISH-0080 and MARE-0133, which also removed the warps' and bridles' 1000 m/s² per-component limit (fishery wp/J1-remove-max-acceleration on fhsim_marine_elements wp/J1-remove-max-acceleration, 2026-09-28): net drag 90.25 kN (default law) and 114.05 kN (TwineCrossFlow), largest warp end tension 109.5 kN and 121.7 kN, door spread 104.46 m and 83.18 m; every figure of the table within 0.1 % of the I1 run (not isolated from other fhsim_marine_elements changes since that run).
Rerun after owner ruling R70 (FISH-0090, FISH-0091: door inertia from Mass plus plate added mass, damping on the relative velocity; fishery fix/deep-review, 2026-09-28), default law, against the same build without R70: net drag 90.63 kN (was 90.25), warp tension sum 182.2 kN (184.0), door spread 100.95 m (104.44), wing spread 32.01 m (32.80), headline height 7.01 m (6.79), door depth 188.50 m (188.46), largest warp end tension 108.3 kN (109.5). The damping change has no effect in this still-water rig and the inertia does not enter a steady state, yet the tow settles about 3 % narrower (door spread still changing 1.1 % between the last two 100 s windows, flattening at about 100.9 m). A likely cause, not isolated: the doors and groundgear rest on the seabed, whose friction admits a range of equilibria, so the settled state depends on the transient. (The R86 diagnosis falsified this: the seabed friction is viscous, and the change was a switch between door cycles, § 1.2.)
Rerun after owner ruling R75 (FISH-0091: the door's linear damping is a numerical stabiliser on the absolute velocity again; R70's inertia kept) and R66 (FISH-0092: door buoyancy from its wetted plate area), same build otherwise: every figure equals the R70 run to the printed digits (net drag 90.63 kN, warp tension sum 182.17 kN, door spread 101.03 m, wing spread 32.03 m, headline height 7.01 m, door depth 188.50 m, largest warp end tension 108.3 kN). In still water the absolute and the relative velocity are the same, and the doors are far below the surface, so the 3 % narrower settling is R70's inertia.
Published net drags at the wing ends of bottom trawls are about 10–20 kN (Fiorentini et al. 2004: 9.8 kN in the flume and 12.8–13.7 kN at sea for Italian bottom trawls at 3.5 kn, 19.6 kN for a high-bosom design). The settled morenot520 figures, 90–131 kN, are 5–10 times that. The morenot520 is a much larger trawl, a two-panel bottom trawl with 155 mm meshes, 3–8 mm twine and about 49 m of headline ropes, rigged with 8 m², 4400 kg doors on 499 m warps from a 72 m vessel and towed at 4 kn instead of 3.5 kn (a factor 1.3 on the speed alone). That places it at the order of magnitude of a large trawl, not beyond it. This is a magnitude check only: nothing published was found for the Mørenot 520 itself.
A trawl can be genuinely unsteady even when the simulation is correct (owner ruling R101). A door can go in and out of stall and pump; warps, bridles and net then carry the cycle. The R86 diagnosis (FISH-0094) found exactly that here: with the gear on the seabed both doors run a self-sustained cycle of about 2 s (angle of attack swinging by up to ±15-20°, the warp point bobbing 0.5 m next to the seabed, the net drag ±15 kN), and before R100 the same inputs ended on one of several such cycles depending on the start. The door's cycle in seabed contact is considered real (R102): the contact model is kept, and the cycle is reported rather than damped away. The seabed friction stays viscous (R103): ToTrawlDoor::AddBottomForces and SeafloorForces::CalcBottomForceSphere have no Coulomb (static) friction, so there is no stick zone and no continuum of equilibria; a future Coulomb friction would make the towing history part of the case, as it is at sea.
So SteadyTow_VALIDATION asks for statistical stationarity:
<ID>_report.txt gives, per quantity, the last window's mean, min, max, percentiles and period, the previous window's mean and band, the two changes and the verdict (stat lines), then the 10 s means as before;SteadyTow_VALIDATION.SecondStartIsReported runs the default-law case with the doors starting 50 m apart instead of 80 m (SteadyTow_SecondStart_in.xml), checks its own stationarity, and, when both starts ran in the same ctest invocation, writes tests/out/SteadyTow/SteadyTow_uniqueness.txt: the two means and bands per quantity, their relative difference and "start-independent" when it is below 0.2 % (below the 0.26 % door-spread difference between the two end states the diagnosis found before R100). It adds one more ~25 min run, in parallel with the others under ctest -j; each run keeps the 3600 s in-test budget (FISH-0089).With the rigid-body ω terms in the door (owner ruling R100, FISH-0093) and the R70 inertia, both laws are stationary at 450 s and the default law ends on the same state from both starts. Means over 350-450 s, with min-max and the dominant period (fishery fix/deep-review, three SteadyTow_VALIDATION runs side by side, 19-20 min each):
| Quantity | 4.0, LocalThroughFlow, doors start 80 m apart | same, 50 m apart | 4.0, TwineCrossFlow |
|---|---|---|---|
| Net drag | 89.6 kN (82.4-96.7) | 89.7 kN (82.4-96.7) | 114.2 kN (101.3-127.1) |
| Warp tension sum at the vessel | 183.1 kN (178.4-186.9) | 183.1 kN (178.4-186.9) | 204.0 kN (196.4-209.5) |
| Port / starboard warp tension | 91.5 / 91.6 kN | 91.6 / 91.6 kN | 102.0 / 102.0 kN |
| Door spread | 109.76 m (109.74-109.78) | 109.76 m (109.74-109.78) | 90.89 m (90.86-90.92) |
| Wing spread | 33.92 m (33.90-33.93) | 33.92 m (33.90-33.93) | 28.27 m (28.25-28.29) |
| Headline height | 6.46 m (6.44-6.48) | 6.46 m (6.44-6.48) | 8.33 m (8.30-8.36) |
| Door angle of attack, port / starboard | 35.4° / 35.4° (31.3-39.8) | 35.4° / 35.4° (31.3-39.8) | 33.8° / 33.7° (26.0-42.2) |
| Door depth (seabed at 190 m) | 188.42 m (188.35-188.50) | 188.42 m (188.35-188.50) | 188.38 m (188.23-188.54) |
| Dominant period | 1.75 s | 1.75 s | 1.79 s |
| Largest warp end tension over the run | 93.7 kN | 93.5 kN | 104.7 kN |
SteadyTow_uniqueness.txt). Before R100 they ended 0.26 % apart in door spread on two different cycles (FISH-0094). The R86 diagnosis's debug-switch runs with the terms reached the same 109.87 m from both starts.The net-hydrodynamics downstream check (WP-D3, fhsim_marine_elements doc/user/validation/downstream_fishery.md) ran Trawl.xml as a cold start and reported net drags of 1.0–1.9 MN with the warps at their 1 MN MaxTension. Those figures were an artefact. They were neither net drag nor an effect of the 4.0 load laws.
Morenot520.xml set MaxAcceleration = "10". NetStructure then scaled down any node acceleration above 10 m/s² (fhsim_marine_elements 4.0 before MARE-0133, src/net/NetStructure.cpp:591-594, LimitAccelerationMagnitude). The node moved less than its force demanded, while the elements pulled on its neighbours in full, so action and reaction no longer balanced. The net then drives itself. Left free in still water (no doors, no bridles, laid out at 50 m depth), it builds node speeds of 3–8 m/s within 20 s, and its codend travels about 30 m and drifts sideways. Integrator tolerances of 10⁻⁶ with a 1 ms step change nothing. The same happens with ME 3.2.1 and under both 4.0 laws. Without the limit, the free net contracts smoothly at 1–2 m/s as its meshes open towards the unloaded 45° (knot stiffness). fhsim_marine_elements has since removed the limit (MARE-0133, owner ruling R40), and the net, warp and bridle files under data/trawl/ no longer set it (FISH-0080).MaxAcceleration switched off, the unchanged D3 cold start (gear collapsed at the origin, vessel at full speed from t = 0) settles too, at 90.3 kN net drag, 183.5 kN warp tension and 105.2 m door spread, the plateau of § 1. With the limit on, the scenario reaches the clamp in every variant tried:Other findings on the way, none of them the cause:
Trawl.xml starts the whole net at one point (every node at the origin, the NetStructure default when no initial condition is given). It also starts the warps straight and taut at 100 kN and the vessel at full speed. This start is violent, but it settles once the limit is off.TrawlPrepare.xml reading TrawlPrepareStates0.txt) cannot be rebuilt: the states file is in no commit (FISH-0078).<LinearSolver Type="DENSE"/>) does not help here: the model has 3107 states, no SimObject reports a Jacobian sparsity and 34 port couplings have no port Jacobian, so the dense Jacobian is built by finite differences. A BDF run produced no output sample (0.06 s) in its first 5 minutes. RK45_i with the input's StepMax = 0.03 is used; a 450 s run takes about 20 min.Inputs: tests/in/SteadyTow/SteadyTow_in.xml (default law) and SteadyTow_TwineCrossFlow_in.xml, both written by tests/in/SteadyTow/make_steady_tow.py. The rig is that of Trawl.xml (vessel, doors, Warp.xml, Bridle.xml, Morenot520.xml). No load law, coefficient, mass, stiffness or damping was changed. These are the differences:
Environment block replaces the 2.x Environment/Basic (190 m depth, no current, no waves, RandomSeed = 1).NetStructureSpec::RefineMesh and checks the counts against NetStructure's 429 nodes, 800 panels and 108 cable elements;Src/Ramp feeds Vessel.Vel from 0 to 2.058 m/s over 120 s.FileOutput logs the ports the test reads, every 0.1 s since R101 (1 s before), including both doors' AngleOfAttack.SteadyTow_SecondStart_in.xml is the default-law input with the doors starting 50 m apart (R101's uniqueness report, § 1.2).SteadyTow_Morenot520.xml, SteadyTow_Warp.xml and SteadyTow_Bridle.xml are byte copies of the rig files, checked by SteadyTow.RigFilesAreCopiesOfTheOriginals. Until FISH-0080 the net copy differed in one attribute, MaxAcceleration = "0" (no limit) in place of "10" (§ 2).
NumericalDamping = "1" of the warps and bridles is kept. It damps the absolute velocity of every cable node (fhsim_marine_elements src/cable/CableBranched.cpp:194), so at 4 kn it acts as an extra drag on the cables. A run with it at 0 gives the same net drag (90.1 kN) and a warp tension sum of 170.5 kN instead of 184 kN: the damping adds about 13 kN (7 %) to the warp tension. The fast load oscillation (§ 1) was not investigated.
| Test | ctest entry | What it checks |
|---|---|---|
SteadyTow.RigFilesAreCopiesOfTheOriginals | fhsim_fishery | the copied rig files |
SteadyTow_VALIDATION.SettlesBelowMaxTension (default law), ...SettlesBelowMaxTensionTwineCrossFlow | one each, label VALIDATION | the run reaches TEnd = 450 s; no warp end tension reaches 99 % of MaxTension; every asserted quantity is stationary between the 100 s windows before TEnd: mean and 5-95 % band edges within 2 % of the mean (§ 1.2) |
SteadyTow_VALIDATION.SecondStartIsReported | one, label VALIDATION | the same for the default law started with the doors 50 m apart; writes the uniqueness report, not asserted (§ 1.2) |
SteadyTow_VALIDATION.ComparesWithMeasurements | one, label VALIDATION | skipped until tests/data/steady_tow_measurements.csv exists (§ 5) |
Red and green: with the net's limit back at 10 m/s² the default-law test fails (a warp at its clamp, the loads unsettled); with the committed input it passes. Each run writes tests/out/SteadyTow/<ID>_report.txt (the cycle statistics of the last window, their change from the window before, the largest warp tension, and 10 s means). The figure comes from those reports:
The VALIDATION entries exist only in a tree configured with FH_WITH_VALIDATION=ON (Conan: -c user.fhsim:validation=True); a default ctest, conan build or conan create leaves them out.
SteadyTow_VALIDATION.ComparesWithMeasurements is ready for data of the Fiorentini et al. (2004) kind (the programme's TRAWL_MEASUREMENTS.md surveys the candidates). It needs a file tests/data/steady_tow_measurements.csv with:
# source:, # kind:, # uncertainty:, # notes:;# input: <test ID>, the steady-tow input under tests/in/SteadyTow that models the measured trawl. The morenot520 is not the trawl of any published data set, so a comparison first needs a net file of the measured trawl;speed_m_s,net_drag_N,door_spread_m,wing_spread_m,headline_height_m,warp_tension_N, then one row per measurement, with nan where a quantity was not measured.The test runs the input, checks that it is stationary, and writes, for the rows at the input's tow speed, the model's cycle mean with its min, max and 5-95 % band, the measurement, their ratio and whether the measurement lies within the model's min-max range to tests/out/SteadyTow/<ID>_measurements.txt (R101: means with ranges). It asserts no tolerance until the scale effects of the data are understood.
The steady tow at 3.0, 3.5, 4.0 and 4.5 kn (1.543, 1.801, 2.058 and 2.315 m/s) under both 4.0 load laws and under 3.2.1 (owner ruling R40), as information, not pass/fail. The inputs are those of § 3 written by make_steady_tow.py with only TOW_SPEED changed (the 120 s ramp, the start and the rig are the same at every speed); the 4.0 kn inputs are byte-identical to the committed ones. Where a run had not settled at 450 s, it was repeated with TEnd 900 s and nothing else changed. Run on 2026-09-27/28.
Settled here means: every quantity of the table changes by less than 0.5 % between the mean over the last 100 s and the mean over the 100 s before. The table gives the mean over the last 100 s.
| Model | Speed (kn) | Net drag (kN) | Warp tension sum (kN) | Door spread (m) | Wing spread (m) | Headline height (m) | Largest change | TEnd (s) |
|---|---|---|---|---|---|---|---|---|
| 4.0 LocalThroughFlow | 3.0 | 50.0 (cycle mean 53.2) | 117.6 (122.1) | 105.6 (108.2) | 35.3 (35.1) | 6.83 (6.86) | 9.7 %, not settled | 900 |
| 4.0 LocalThroughFlow | 3.5 | 70.3 | 153.1 | 115.7 | 35.4 | 6.40 | 0.01 % | 450 |
| 4.0 LocalThroughFlow | 4.0 | 90.3 | 184.0 | 104.4 | 32.8 | 6.79 | 0.12 % | 450 |
| 4.0 LocalThroughFlow | 4.5 | 112.1 | 215.8 | 97.6 | 31.1 | 7.01 | 0.18 % | 450 |
| 4.0 TwineCrossFlow | 3.0 | 66.5 | 134.2 | 105.4 | 32.1 | 7.59 | 0.00 % | 900 |
| 4.0 TwineCrossFlow | 3.5 | 89.7 | 169.6 | 100.0 | 30.5 | 7.85 | 0.17 % | 450 |
| 4.0 TwineCrossFlow | 4.0 | 114.1 | 203.2 | 83.2 | 26.4 | 8.79 | 0.21 % | 450 |
| 4.0 TwineCrossFlow | 4.5 | 138.9 | 237.7 | 89.6 | 27.5 | 8.55 | 0.19 % | 450 |
| 3.2.1 | 3.0 | 77.9 | 145.6 | 97.7 | 29.4 | 8.47 | 0.00 % | 900 |
| 3.2.1 | 3.5 | 103.7 | 182.9 | 88.0 | 27.0 | 8.87 | 0.40 % | 450 |
| 3.2.1 | 4.0 | 130.7 | 216.5 | 74.3 | 23.2 | 9.48 | 0.13 % | 450 |
| 3.2.1 | 4.5 | 152.3 | 249.8 | 83.4 | 25.1 | 9.31 | 0.00 % | 900 |
The largest warp end tension of any run is 126 kN (3.2.1, 4.5 kn), far below MaxTension (1000 kN). The 4.0 kn rows reproduce § 1.
Drag exponent. A least-squares fit of log(net drag) = log(c) + n log(U) over the settled runs:
| Model | n | c (kN at 1 m/s) | Runs fitted | n over 3.5–4.5 kn only | Local n (3.0→3.5, 3.5→4.0, 4.0→4.5) |
|---|---|---|---|---|---|
| 4.0 LocalThroughFlow | 1.86 | 23.6 | 3.5, 4.0, 4.5 kn | 1.86 | (1.80 with the cycle mean), 1.88, 1.84 |
| 4.0 TwineCrossFlow | 1.82 | 30.5 | all four | 1.74 | 1.93, 1.80, 1.67 |
| 3.2.1 | 1.67 | 38.3 | all four | 1.54 | 1.85, 1.74, 1.30 |
With the 3.0 kn LocalThroughFlow cycle mean (53.2 kN) included, n = 1.84. All three exponents are below 2: the net and the rig change shape with speed (headline height, spreads), so the drag does not scale with U² at a fixed geometry. The door and wing spreads are not monotonic in speed: under TwineCrossFlow and 3.2.1 the 4.0 kn point has the narrowest spread, and the local 3.2.1 exponent between 4.0 and 4.5 kn (1.30) comes with the spread widening again (74 → 83 m). This was not investigated further.
5905c95 with fhsim_marine_elements integration 9aca09d (libraries copied to a scratch playpen), the § 3 rig files of 5905c95. The inputs are byte-identical to those this branch's generator writes (checked with cmp). A check run after the MaxAcceleration removal (fishery 3a22c36, fhsim_marine_elements 8d6e628, the rig files of 3a22c36) at 4.0 kn, LocalThroughFlow, gives net drag 90.25 kN, warp tension 183.98 kN, door spread 104.46 m, wing spread 32.81 m, headline height 6.79 m: within 0.1 % of the table.main ff17183 built with fhsim_marine_elements 3.2.1 from the Conan cache, the same inputs (HydroModel is not set in the default-law input; 3.2.1 has one law), and the rig files of 5905c95 (net MaxAcceleration = "0", warps and bridles 1000 m/s², which 3.2.1 still reads), as § 1.Commands, from this repository's root (<pp40> and <pp321> are copies of the playpen bin folders of the two builds, with the SimObject library symlinks dereferenced):
The 450 s runs at 3.0 kn (all three models) and of 3.2.1 at 4.5 kn were made first and are superseded by the 900 s runs above; their first 450 s are identical (checked for 148 s of the LocalThroughFlow run). report prints the table rows, the change between the last two 100 s windows (flagged NOT SETTLED at 0.5 % or more) and the fit over the settled runs, and writes the figure; the quantities are those of SteadyTow_Test.cpp (ReadHistory).