|
FhSim
3.1.0
Marine systems simulation
|
The XML parameters of every SimObject that casts or receives wakes through environment::wake::BodyWake (contract C3), in one place. A SimObject's own documentation lists CastWake and refers here. They are read once, by ReadBodyWakeSettings(creator, kind) (include/fhsim_environment/BodyWake.h), which calls ReadWakeSettings, for a source set ReadSourceSetWakeSettings (both WakeSchedule.h), and ReadExternalWakeUpdate (ExternalWakes.h). What the schedule and the casters do with them is in Wakes.
| Parameters | A body (BodyWakeKind::Single: TestWakeBody, a sphere or disc with a shape caster, fhsim_marine_elements' Net/Disk, Net/Sphere, fhsim_base's Adaptive/CablePendulum (the ball), fhsim_fishery's Trawl/CenterWeight) | A source set (BodyWakeKind::SourceSet: a net, TestWakeCluster) |
|---|---|---|
CastWake and the common Wake* parameters (below) | yes | yes |
WakeEvaluation, WakeLength, WakeGrid, WakeXStartFactor | no | yes |
ExternalWakeUpdate | yes | yes |
WakeGroup | yes, but not for a self-propelled body (a setup error with CastWake) | no (a setup error with CastWake) |
A WakeGroup SimObject reads the parameters of a source set (not ExternalWakeUpdate, it receives nothing), Wake groups.
Every parameter is read whether or not CastWake is set, and the checks run only with CastWake. Without it, each one given in the input is logged once as "ignored: CastWake is not
true" (ENV-0070, fhsim_marine_elements MARE-0335), since a receiver with, say, WakeUpdate="Periodic" would otherwise run without a word. ExternalWakeUpdate acts on every receiver, casting or not. The object's fluid density is not a wake parameter: it is the SimObject's own (Rho in the test models), handed to the BodyWake at construction.
Defaults by lead ruling R27 (choices, not fitted values); WakeIterations by owner ruling R130.
| Parameter | Default | Meaning | Setup error when |
|---|---|---|---|
CastWake | false | Register and build the wake. | – |
WakeUpdate | Freeze | Off: one build at WakeBuildTime, never rebuilt (once more after a failed current lookup dropped the wake, ENV-0082). Freeze: a build at WakeBuildTime and up to WakeIterations more until converged, then frozen; re-armed when the source velocity or the ambient current at the source drifts, or the object moves away from its frozen wake. Periodic: a build every WakePeriod. | not Off, Freeze or Periodic |
WakeBuildTime | 0 s | Time of the first build (lead decision R51: keep 0). | not finite |
WakeIterations | 4 | Freeze: rebuilds after the first (owner ruling R130; 2 before). An N-row farm of casting structures needs N or more (owner ruling R121). | negative |
WakeIterInterval | 5 s | Freeze: time between those rebuilds. | ≤ 0 or not finite |
WakeTolerance | 0.01 | Freeze converges when the caster's change measure is below it: |ΔM|/M for a body or a source set without a private field; for one with a private field (a net) the larger of max|ΔR| at the sources and the |ΔM|/M of its lumped source (R121). | ≤ 0 or not finite |
WakePeriod | 10 s | Periodic: time between rebuilds. | ≤ 0 or not finite |
WakeRelaxation | 1 | Periodic: α in (0, 1], M = αM_new + (1 − α)M_old. | outside (0, 1] |
WakeBlendTime | 2 s | Smoothstep cross-fade of each rebuild; with 0, casters that rebuild in the same step see each other in PreOdeFcn order. | negative, or above WakePeriod (Periodic) or WakeIterInterval (Freeze) (lead ruling R22) |
WakeRearmTolerance | 0.1 | Freeze: drift of the filtered source velocity, or of the filtered ambient current at the source, relative to the relative flow speed at the freeze (at least 1 mm/s), that re-arms Freeze; a source velocity below it at the freeze is snapped to 0 (R50). | ≤ 0 or not finite |
WakeRearmDistance | 0.1 | Freeze: distance between the object's reference point and its frozen wake frame, as a fraction of √(frontal area), that re-arms Freeze (R50). | ≤ 0 or not finite |
WakeFilterTime | 5 s | Low-pass time constant of the source velocity and of the ambient current the re-arm watches; 0 does not filter. | negative or not finite |
WakeExpansion | 0.05 | Kernel expansion rate k (marenv contract C4). | ≤ 0 or not finite |
WakeCutoff | 1e-3 | (1) A source set's private grid: the deficit below which a footprint is truncated; not given, the grid's cutoff is sized from the number of sources (R48). (2) With CastWake: the receiver's cutoff tier of the other objects' wakes (owner decision R47); without CastWake that tier is 1e-4 and this parameter is ignored (and logged so). | outside (0, 1) |
An object that oscillates: WakeUpdate="Periodic" (ENV-0109, owner ruling 2026-10-13: a recommendation, the default stays Freeze). Freeze suits an object that settles. One that never does (swinging trawl doors, a rig or a body in waves) converges in no round and re-arms the next at once, so Freeze rebuilds about every WakeIterInterval with a blend and a rebuild, freeze and re-arm line each time (about 60 re-arms in 300 s for a trawl rig). Set WakeUpdate="Periodic" and a WakePeriod (at least WakeBlendTime, R22) short against the time the object takes to move x_start against its wake; WakeRelaxation below 1 damps the rebuilt M. The schedule and the shared parameters.
Read by ReadSourceSetWakeSettings for BodyWakeKind::SourceSet only; they act on the object's private field (the shading of its own sources), not on the lumped wake the others see.
| Parameter | Default | Meaning | Setup error when |
|---|---|---|---|
WakeEvaluation | Grid | Grid: the private field superposed once into a grid in the wake frame; Direct: the direct sum over the sources, the reference; None: no private field, the sources do not shade each other (ENV-0098). | not Grid, Direct or None |
WakeLength | 0 m | Grid reach beyond the object's rear source; 0 is the largest source diameter. | negative |
WakeGrid | 0, 0, 0 | Grid cells along the flow, across it and vertically; 0, 0, 0 sizes the grid from the sources at each rebuild (R48). | a zero or negative count unless all three are 0 |
WakeXStartFactor | 0.5 | x_start = max(WakeXStartFactor·D, x_start,min) of each private source: no deficit closer downstream; the deficit ramps in by a smoothstep over 0.079 D behind x_start, so with the default it is the full kernel from the Eq. 11 meter 0.579 D on (marenv kPanelRampFactor, owner ruling R-b). A body's lumped wake always starts at its rear face (QF7) and does not read it. | negative |
Grid or Direct (ENV-0108, owner ruling 2026-10-13: documented, the default stays Grid): Grid is for dense sets, a net's panels. For a few bodies far apart (an IndexedWakeCastingObject such as a trawl rig's doors and clump weights) set Direct: there the grid's cells are far larger than x_start, a body samples a lattice-dependent share of its own interpolated deposit, and the result depends on the input order of the bodies and breaks a mirror symmetry by as much as the wake effect itself (0.1 to 5 mm against 2e-5 m with Direct, An object of many sources). Direct also leaves a sample point's own sources out of its query, so a body never sees its own private source after overtaking its frozen wake (ENV-0107); Grid cannot. A WakeGroup defaults to Direct.
| Parameter | Default | Meaning | Setup error when |
|---|---|---|---|
ExternalWakeUpdate | Step | Step: the other objects' wakes and the own private field are composed once per integrator step at the sample points, in PreOdeFcn, and held for the step (owner decision R46, R135, R136); Evaluation: composed live in every evaluation, the reference: bit for bit the one rule for the object's query (the other objects' registered fields plus its own private field, applied to the live current, plus the live waves), Who sees the wake. It differs from the plain query GetWaterVelocity (GetParticleVelocity) by the object's own wake: its registered field left out, its private field composed in. See The wakes, once per step: ExternalWakeUpdate. Read by every BodyWake and by the ElementFlowInteraction of a cable of its own (MARE-0223, Cables: the element points), which takes the other objects' wakes at the non-casting tier 1e-4 and reads no WakeCutoff. A cable that belongs to a casting body reads neither: it takes its owner's (ENV-0110). | not Step or Evaluation |
A cable casts no wake. Its elements meet the flow through an environment::wake::ElementFlowInteraction (ElementFlowInteraction.h, Receiving at many points: ElementFlowInteraction), which takes the other objects' wakes once per step at points the cable computes from its start state and holds them for the step; the current and the waves stay live at the position of each evaluation.
ExternalWakeUpdate and takes at the non-casting tier 1e-4.WakeCutoff when the body has CastWake, else 1e-4) and its ExternalWakeUpdate; it reads no parameter of its own (ENV-0110).| Cable | Library | Owner | Points (one per element, point i = element i) | Velocity read |
|---|---|---|---|---|
RbCable/Cable | fhsim_marine_elements | its own | the element centres (each rigid element's position state) | WaterVelocity at the centre |
RbCable/6DofCable | fhsim_marine_elements | its own | the element centres | WaterVelocity at the centre |
RbCable/Ring | fhsim_marine_elements | its own | the element centres | WaterVelocity at the centre |
Cable/LumpedMass, Cable/Branched (each section) | fhsim_marine_elements | its own | the element midpoints, the mean of the two end nodes | WakedCurrent at the midpoint, plus the wave particle velocity averaged over the two ends (MARE-0225) |
TrawlCable, RundDorg, and the TrawlCables and MooringCables that join their solver | fhsim_marine_elements | the solver's owner (its trawl rig wake) | the element centres of every cable segment in the solver, in the order of its segments | WaterVelocity at the centre |
Cable | fhsim_base | its own | the segment midpoints | WaterVelocity at the midpoint |
Adaptive/CablePendulum | fhsim_base | the ball | the segment midpoints; segment s joins point s and s + 1 (0 the suspension, the last the ball) | WaterVelocity at the midpoint |
A self-propelled body (a PropelledObject, A self-propelled body: hull wake and propeller jet) reads no parameter of its own here: its propeller jet shares the body's CastWake and common Wake* parameters. With CastWake the hull wake and the jet are cast together, each on its own schedule of the same settings. For the jet:
| Parameter | Acts on the jet as |
|---|---|
WakeUpdate, WakeBuildTime, WakeIterations, WakeIterInterval, WakePeriod, WakeBlendTime, WakeFilterTime | For the hull: when the jet is republished, its blend, and the filtered source velocity it translates with. |
WakeRearmTolerance | For the hull (drift of the source velocity or the ambient current at the propeller, the snap at the freeze), and also: a frozen jet re-arms when |T_eff − T_eff,freeze|/T_eff,freeze is above it, against the T_eff it was frozen with (T_eff ≤ 0 counted as 0, so thrust setting in re-arms a jet frozen without it; owner ruling 2026-10-12). |
WakeTolerance | Freeze converges when |ΔT_eff|/T_eff between two builds of a round is below it. |
WakeRelaxation | Periodic: T_eff = αT_eff,new + (1 − α)T_eff,old; a T_eff ≤ 0 is published as given, so the jet stops at once. |
WakeRearmDistance | Relative to the propeller disc, √(πD_p²/4), not to the hull's frontal area. |
WakeExpansion | Not at all: the jet's spreading is the jet law's (marenv doc/wake.md § 4.2). |
WakeCutoff | As a receiver's cutoff tier of the other objects' jets, relative to each jet's velocity scale; not on the jet itself. |
WakeGroup | Refused with CastWake: a group has no place for a jet. |
The propeller's own parameters (diameter, position) are the SimObject's (fhsim_base's Tanker, fhsim_fishery's Auv).
| Parameter | On | Default | Meaning | Setup error when |
|---|---|---|---|---|
WakeGroup | a body | empty | With CastWake: the name of the WakeGroup SimObject the body casts with; it casts no wake of its own, and its schedule parameters do not act (Wake groups: separate SimObjects, one wake). | it names no WakeGroup SimObject (in FinalSetup); given to a source set; the body's density is not the group's |
CastWake | the group | false | Must be true. | not true |
WakeEvaluation | the group | Direct | As for a source set, whose default is Grid (owner ruling 2026-10-12, Wake groups: separate SimObjects, one wake). | as above |
other Wake* of a source set | the group | as above | The group's schedule, kernel and private field. | as above |