FhSim  3.1.0
Marine systems simulation
Loading...
Searching...
No Matches
0398 — RbCable/Cable initial condition places the joints up to 7 mm apart; the rate kicks the cable at t = 0
ID 0398
Class BUG
Severity 1
Status blocked

Models: RbCable/Cable

Found: 2026-10-17, feature seabed-contact, task A1 (the axial Baumgarte rate of MARE-0395 made the gaps visible)

Decision needed: Is the catenary initial condition of RbCable/Cable to be changed so that the joints start closed (it moves every CableRM baseline that does not set its own states), or is the start-up transient accepted?

Evidence

src/RMCable/Cable.cpp:220-234 (DistributeCatenary): each element is put at the arc-length midpoint of its stretch of the catenary (CableCoordinate = (i + 0.4999 - i1) L / (i2 - i1)) with its axis along the tangent there. The elements are straight and the curve is not, so the end of element i and the start of element i + 1 do not meet: on CableRM_FreeSwing (10 m, 10 elements, ends 8 m apart) the largest joint gap at t = 0 is 7.1 mm, at the ends where the curvature is largest (MaxJointGap of tests/RbCable_Test.cpp, t = 0 row).

Until MARE-0395 the axial rate was a time (1e-3 1/s), the gaps were never corrected and the cable carried them for good. With the rate axialBaumgarteRate (1/s, updateFreq before task O2) the rows close them in about 0.1 s: the end reaction ForceA, ForceB of CableRM is 1.2e4 and 2.2e4 N at t = 0 (it was 6 N) and the cable swings from the kick; the bending damping (5 % of critical) has the end reactions still ringing by a few tenths of a newton at 20 s.

Effect

A model that reads ForceA/ForceB at t = 0 (the first evaluation) sees a spike of the order of 1e4 N for a few milliseconds (an adaptive solver handles it, but a body at the end gets the impulse). A cable that should start at rest on its static shape does not: CableRM_EndReactionsBalanceTheWeightInWater now checks the mean of the end reactions over 10 to 20 s instead of the value at 20 s.

Possible fix

Place the elements so that the joints coincide: put the joints J_i on the catenary at unit chord distance l (marching from A) and let each element's centre be the midpoint of its chord and its axis the chord direction. The last joint then misses B by the sum of the arc-chord differences (about 6 mm here); choosing the arc length ‘L’of the catenary so that the 10 chords end on B closes that too (one root-finding onComputeCatenary). User-set states (MARE-0394) and retracted lengths stay as they are. AllCableRM` results that start on the catenary move.

Test that would prove it

CableRM_FreeSwing with the current off: the largest joint gap at t = 0 is below 1e-4 m, and ForceA at t = 0 is within a few percent of its value at 1 s.

Risk

Moves every result of an RbCable/Cable that starts on the catenary, and CableRM_UserInitialCondition; TrawlCable-like models that call InitialConditionSetup of this class are the only consumers in the repo.