FhSim  3.1.0
Marine systems simulation
Loading...
Searching...
No Matches
Wake parameters

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.

Who reads what

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.

The common parameters

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.

The private field of a source set

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.

Receiving

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

Cables: the element points

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.

  • A cable of its own reads ExternalWakeUpdate and takes at the non-casting tier 1e-4.
  • A cable that belongs to a body (built from the body's BodyWake) receives as the body: with its query (never the body's own lumped wake or jet; a source set's private field composed in), its cutoff tier (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 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).

Wake groups

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