|
FhSim
3.1.0
Marine systems simulation
|
The panel load laws of the nets, their sources, velocities, parameters and limitations (formerly Sections 1 to 13 of this page) moved with the laws to fhsim_environment (its ADR 0002, MARE-0351): they are its page Hydrodynamics: shape and panel load laws, doc/user/hydrodynamics.md, which keeps the section numbers and anchors (nhm_sources to nhm_limitations), next to the shape laws of a sphere, a disc and a cylinder element and the submerged fraction. The headers are fhsim_environment/hydrodynamics/ (namespaces hydrodynamics and net_solidity). This page keeps what this library adds on top of the laws: how its nets and bodies cast their wakes (Section 14). Why the pieces sit where they do is recorded in doc/adr/ and fhsim_environment's ADR 0002; the vocabulary is fixed in CONTEXT.md.
Since the owner ruling of 2026-10-13 (MARE-0110, resolved) the default law, LocalThroughFlow, takes its lift at 45° from the MF2022 Eq. 10 lift-to-drag ratio (fhsim_environment 3.1.1), so the 26–31 % lift deficit at high solidity is gone. Its two-harmonic angle form still misfits the angle dependence of Rudi, Løland and Zhan at 60–80° (fhsim_marine_elements_issue_0131). The numbers, the tests still disabled and their reasons are in Section 11.4 of fhsim_environment's doc/user/hydrodynamics.md, where the law lives.
The load laws receive U∞; the wake decides how much of the upstream flow reaches a panel or body. The kernel, its composition and the gridded and direct fields are marenv's (its wake manual, doc/wake.md, and ADR 0002 there). This section states what the casters of this library hand to marenv since phase F of the net-hydrodynamics programme (ADR 0006, owner rulings R34 and R36, MARE-0129, MARE-0127). Parameters are in the user guide (Wake casting).
With CastWake, Net/NetStructure and Net/NetStructureWithConstraints keep two fields (src/net/NetFlowInteraction.h: fhsim_environment's BodyWake over its PanelSourceSet, the net's panels through src/net/NetWakePanels.h; with WakeEvaluation None only the lumped field, and the panels do not shade each other):
| Field | Built from | Registered in the environment | Sampled by |
|---|---|---|---|
private field: GriddedWake (WakeEvaluation Grid) or marenv SourceSetWake (Direct) | one elementary source per panel, from the marching build | no | the net's own panels and cable elements |
lumped field: SourceSetWake with one source | the net's total panel force and frontal extent (Section 14.2) | yes, under the SimObject name | every other object |
net_solidity::CylinderSolidity). With SolidityModel Fixed the given Sₙ is used. MF2022 fitted Eq. 11 in the image-measured Snm, 2–27 % above S_c for their nets (p. 041301-3); the owner chose S_c. The law's induction (Section 8) still takes the law's Sₙ.GetWakedCurrent and the net's WakeQuery (BodyWake::Query(): exclude the own lumped field, add the private field), plus the wave particle velocity averaged over their nodes (owner ruling R62), through NetFlowInteraction, so they see the other objects' lumped wakes, the net's internal wake and the waves, and never the net's own lumped source. Without CastWake the query is empty, and the current is the facade's waked current. With ExternalWakeUpdate Step (the default) the wake composition at each centroid and midpoint, the private field included, is taken once per integrator step in PreOdeFcn, after the net's own rebuild, and held for every RK stage and Jacobian evaluation of the step (owner decision R46, owner ruling R135); during a rebuild blend the held samples take the blend weight of each evaluation's time, so the right-hand side stays C1 in time through the blend (owner ruling R136).WakeLength).** The private grid covers the structure and reaches WakeLength beyond the rear panel; WakeLength 0 is the largest panel diameter (fhsim_environment WakeCaster.cpp, PrivateGrid). Before phase F WakeLength was the reach of the registered grid other objects sampled, 0 meaning five times the structure's size; it no longer changes what other objects see.VisualFieldPlane, VisualWakeSources and EnvironmentProvider::GetWakeDeficit show the registered fields, i.e. the lumped wakes only, not the private field inside and just behind the net. Probes such as Test/FlowProbe inside a casting net read no internal wake either, so the W9 tests of the Zhan cylinder measure at caster level: the nets' BodyWake over the same cylinder of NetElement3N panels builds the private field, sampled at the rear-half centroids with the panels' own query (MARE-0132, owner answer QF13).After each marching build, at the same time and with the same blend, the net publishes one lumped source (marenv MakeLumpedSource):
SetAddedDragPerMPS (both nets; reachable only through that setter, which has no input option, MARE-0384): the wake-casting panel evaluation does not include it, so M omits it in the same way (MARE-0164).Rho, q²_amb the area-weighted mean over the panels of |U_amb − u_p|², U_amb the current without any wake (lead ruling R87, superseding the shaded mean square of R55), so the momentum the lumped wake carries is the drag the net feels; with Periodic and WakeRelaxation α < 1, M ← αM + (1 − α)M_prev (marenv RelaxLumpedSource).MomentumFluxSum, owner ruling R95, which replaced R88's capped linear sum), and the facade composes the registered fields the same way. The private field keeps the product rule d = 1 − Π(1 − d_i) and multiplies onto the others' composition: its per-panel M is normalised by each panel's own shaded inflow, so adding linearly would count the shading twice (marenv doc/wake.md §4).The rebuild log line ends with "lumped source M = …, area …, rear centre (…) m".
M against the old panel sum (QF14, open). The lumped M is the drag the net actually feels over the ambient ½ρq²_amb (R87; over the shaded ½ρ|U_ref|² until R55 and R87). Before phase F other objects saw the per-panel sources, and each panel's M is its drag over its own shaded inflow's ½ρ|U|² (KF2012Common.h:369), so a shaded rear panel kept about its unshaded M. For the 960-panel cage of the benchmark the lumped M is 11.75 m² against 12.99 m² for the panel sum (0.905 of it), and a second cage 20 m behind is shaded 3.7 % less: cage-2/cage-1 drag 0.760 against 0.733 with the old direct panel sum (Net hydrodynamics: benchmark of load laws and wake evaluation § 11.3). The design's definition is kept, so the far wake carries exactly the felt drag; whether it should carry the panel sum instead is owner question QF14. In S3 (Lader cages) the panel drag of the lumped source, M·½ρU_ref², is within 1 % of the model's total drag at 0.5–0.93 m/s (MARE-0129).
With CastWake, Net/Disk and Net/Sphere cast one lumped source each through fhsim_environment's BodyFlowInteraction (a BodyWake) and the shape casters disk_hydro::DiskCaster and sphere_hydro::SphereCaster (MARE-0127, QF10, MARE-0351), with the same Wake* parameters as a net except WakeEvaluation, WakeGrid, WakeLength and WakeXStartFactor, which they do not read. The field is registered in FinalSetup and rebuilt in PreOdeFcn; OdeFcn does nothing wake-related.
Net/Disk | Net/Sphere | |
|---|---|---|
| Force | its drag law of lead ruling R24 (environment::disk_hydro::DragForce) at the disk velocity minus the current-only free stream | its drag −K|v|v, K = ⅛ρπC_d D(D − d/π), at the sphere velocity minus the free stream |
| Frontal area normal to ê_U | π(D² − d²)/4·|n·ê_U| + D·T·√(1 − (n·ê_U)²) (face ellipse less the cable hole plus edge rectangle; D = DiskD, T = DiskT, d the cable diameter D; ENV-0103) | πD²/4 |
| Rear-face centre, downstream of the centre | (T/2)|n·ê_U| + (D/2)√(1 − (n·ê_U)²) | D/2 |
disk_hydro, ENV-0103); its edge drag uses (D − d)·T and its edge silhouette D·T. The sphere's drag uses D(D − d/π)π/4 (sphere_hydro::DragFactor, K above) and its frontal area the full πD²/4. With the default cable diameter 0.01 m on a 1 m body the differences are at most 1 %; a thick cable through a small sphere or a disk seen edge on widens its lumped wake relative to its drag area.Force input port in PreOdeFcn and hands its direction to its DiskCaster as the axis n (SetAxis; z when the force is zero), as OdeFcn takes it.OdeFcn and OdeJacobian with GetWakedFlow and WakeQuery{exclude = own field}, so a body never samples its own wake; without CastWake the query is empty and the result is bit for bit that of GetParticleVelocity. Their wake starts at the rear face, downstream of the centre where they read the flow.CurrentLoad computes the force with the body's own state velocity, while U_ref and the field's source velocity use the source velocity filtered over WakeFilterTime (default 5 s). For a fixed, moored or steadily moving body the two agree; during an acceleration M = F·ê_U/(½ρ|U_ref|²) is slightly inconsistent. A net has no such difference: its build evaluates every panel at the mean of its filtered node velocities, which also give u_s and U_ref (fhsim_environment src/environment/WakeCaster.h).BodyWake.RegisteredSourceHasTheMomentumDeficitOfTheDrag), above 0.96, so its lumped area is widened to M/0.96 (logged).Nothing enters the Jacobian in either case: the fields depend on time only, and the water velocity is a frozen input, as for the current (marenv wake manual, "The Jacobian approximation").