FhSim  3.1.0
Marine systems simulation
Loading...
Searching...
No Matches
Hydrodynamics: shape and panel load laws

This page states the laws by which the water loads a body, as the headers in include/fhsim_environment/hydrodynamics/ implement them: the panel load laws of nets (Sections 1 to 13, which fhsim_marine_elements' Net hydrodynamics: methods manual held until they moved here), the shape laws of a sphere, a disc and a cylinder element (Section 14), and the submerged fraction of a body (Section 15). For every law it says which velocity it works on, every equation with its source, and what it does outside its range. Where the code departs from a paper, the page says so. Why the laws live in the environment is ADR 0002 (doc/adr/); "ME ADR" refers to the decision records of fhsim_marine_elements. The vocabulary is fixed in CONTEXT.md. How a body hands its load to the wake caster is on the page Wakes.

Header Namespace Contents
PanelLoadTypes.h, PanelFormulas.h, KF2012Common.h, LocalThroughFlow.h, ScreenKF2012.h, ScreenMF2022.h, TwineCrossFlow.h, TwineFriction.h, PanelLoadLaw.h, PanelClampLog.h hydrodynamics The panel load laws, the PanelLoadLaw variant and its parser (contracts C1 to C3)
NetSolidity.h net_solidity The caller-side solidity rules Fixed and MeshOpening
SphereHydro.h environment::sphere_hydro Sphere drag, added mass, excitation, wake loads
DiskHydro.h environment::disk_hydro Disc drag along and across the axis, its Jacobian, wake loads
CylinderHydro.h environment::cylinder_hydro Cable element Reynolds number, Cd and Ct fits and their derivatives, Morison inertia
BodySubmergence.h environment::body_submergence Wet fractions, the gated surface queries, the medium density

1. Sources

Equations are cited by source, equation number and journal page.

Tag Reference
KF2012 T. Kristiansen, O.M. Faltinsen, "Modelling of current loads on aquaculture net cages", Journal of Fluids and Structures 34 (2012) 218–235.
MF2022 H. Moe Føre, P.C. Endresen, H.V. Bjelland, "Load coefficients and dimensions of Raschel knitted netting materials in fish farms", J. Offshore Mech. Arct. Eng. 144 (2022) 041301; pages 041301-1 to -8.
Zhan 2006 J.M. Zhan, X.P. Jia, Y.S. Li, M.G. Sun, G.X. Guo, Y.Z. Hu, "Analytical and experimental investigation of drag on nets of fish cages", Aquacultural Engineering 35 (2006) 91–101.
Løland 1991 G. Løland, Current forces on and flow through fish farms, PhD thesis, NTNU, 1991. Used here through KF2012 Eq. 4, p. 222.
Schubauer 1950 G.B. Schubauer, W.G. Spangenberg, P.S. Klebanoff, Aerodynamic characteristics of damping screens, NBS report, 1950. Used here through KF2012 Eq. 7, p. 222.
Rudi 1988 H. Rudi, G. Løland, L. Furunes, Model tests with net enclosures, MARINTEK report, 1988. Used here through KF2012 Fig. 5, p. 224.
EF2006 S. Ersdal, O.M. Faltinsen (2006), cited by TwineCrossFlow.h and NetElement3NForces.h for its Eqs. 27–28 and Table 3, without a full reference. The paper is not in the programme's background set, and those citations have not been checked against it.

2. The four velocities

Every velocity below is relative to the panel. Each coefficient set in the literature is defined on exactly one of them.

U∞ free stream ambient flow + others' wakes − panel velocity Uₙ = U∞(1+r)/2 arrival velocity (after the panel's own induction) Uₜ = Uₙ/(1−Sₙ) between the twines U_r = r·U∞ far wake: part of the next panel's U∞ downstream panel

Symbol Name Definition Source
U∞ free-stream velocity u_water − u_panel, where u_water is the ambient current plus the wakes of other panels and structures, never the panel's own induction. For a towed net in still water, U∞ = −V_tow. This is what a load law receives, tagged FlowReference::FreeStream. CONTEXT.md; KF2012 Eq. 19, p. 235
Uₙ arrival velocity The flow arriving at the panel after its own blockage has slowed it, Uₙ = U∞(1 + r)/2. The subscript does not mean the normal component. MF2022 Eq. 7, p. 041301-5
Uₜ through-flow speed The speed between the twines, Uₜ = Uₙ/(1 − Sₙ). Twine drag coefficients and mesh Reynolds numbers are defined on it. MF2022 Eqs. 6 and 8, pp. 041301-4, -5
U_r wake velocity The flow in the panel's far wake, U_r = r·U∞; a downstream panel sees it as part of its own U∞. The wake belongs to the environment's wake fields, not to the load law. MF2022 Eq. 5, p. 041301-4

Here r is the velocity ratio behind the panel and d = 1 − r the velocity deficit. Induction turns U∞ into Uₙ inside the load law. The wake turns one panel's U∞ into the next panel's, in the environment. Neither is counted in both places (ME ADR 0004). Which wakes reach a panel, and what a net or body casts for others, is on the page Wakes.

3. Common definitions

Force coefficients. Every law returns a force of the form

\[ \mathbf F = \tfrac12 \rho A |\mathbf U_\infty|^2 \left( C_D\,\hat{\mathbf u} + C_L\,\hat{\mathbf L} \right) \]

with the coefficients defined on the panel area A and the free-stream speed |U∞| (KF2012 Eq. 1, p. 221; MF2022 Eq. 3, p. 041301-4). TwineCrossFlow is the exception: it sums bar and knot forces directly (Section 7).

Inflow angle. θ is the angle between U∞ and the panel normal n. The normal is turned into the half-space of the flow, n = sign(U·ñ)ñ (KF2012 Eq. 20, p. 235), and θ = arccos(U·n/|U|) (Eq. 22, p. 235), so 0 ≤ θ ≤ π/2. The code computes cos θ = |Û·n| with no branch on θ.

Directions. Drag acts along the flow, û = U/|U|. Lift acts in the plane of n and û, normal to û (KF2012 Fig. 3 and text, p. 221):

\[ \hat{\mathbf L} = \frac{\mathbf n - \cos\theta\,\hat{\mathbf u}}{\sin\theta}, \qquad C_D = C_N\cos\theta + C_T\sin\theta,\quad C_L = C_N\sin\theta - C_T\cos\theta \quad\text{(KF2012 Eq. 2, p. 221).} \]

KF2012 add a machine-precision ε to the tangent direction when its denominator vanishes (Eq. 21, p. 235). The KF2012-based laws and ScreenMF2022 avoid it. Every lift harmonic sin 2kθ carries the factor sin θ cos θ, so the code writes the lift force as

\[ C_L\,\hat{\mathbf L} = c_l\,(2 b_2 + 4 b_4 \cos 2\theta)\left[(\hat{\mathbf u}\cdot\tilde{\mathbf n})\,\tilde{\mathbf n} - (\hat{\mathbf u}\cdot\tilde{\mathbf n})^2\,\hat{\mathbf u}\right] \]

with the unflipped normal ñ (lead ruling R8). It is smooth at θ = 0 and at θ = π/2, where L̂ itself is undefined or flips.

Panel-load diagnostics (PanelLoadTypes.h). The laws also report:

  • drag and lift, the signed magnitudes along û and L̂;
  • θ;
  • reynolds, under the law's own definition;
  • throughFlowSpeed Uₜ;
  • momentumDeficit M = drag/(½ρ|U|²) = C_D·A, in m², the elementary wake source strength;
  • localCd, MF2022 Eq. 9, p. 041301-5:

\[ C_d = C_D\,\frac{4(1-S_n)^2}{S_n(1+r)^2}, \qquad r = \min(1.08 - 0.97\,S_n,\ 1). \]

Flags (PanelLoad::flags). The laws never throw in Evaluate. Where an input leaves its range, they clamp it and set a flag:

Bit Value Meaning
0 1 Solidity clamped
1 2 Reynolds number clamped (KF2012-based laws only)
2 4 |U| below the speed floor; the floor replaces |U| in divisions
3 8 Velocity ratio r of MF2022 Eq. 11 clamped to 1 (Sₙ < 0.08/0.97 ≈ 0.0825), every law that evaluates r (Section 4)

3.1 In-plane twine friction of the screen laws

Every harmonic of the KF2012 Eq. 14 and MF2022 Eq. 10 angle forms carries a factor cos θ, so the screen model alone gives no load for flow in the panel plane. By owner decision (Q13, lead ruling R36 a; MARE-0111), LocalThroughFlow, ScreenKF2012 and ScreenMF2022 add the tangential skin-friction term of TwineCrossFlow (Section 7, row 7) to their force. The code is twine_friction::EvaluateTwineFriction in TwineFriction.h:

\[ \mathbf F_t = \sum_{f\in\{u,v\}} \tfrac12\rho\, d\, \max(l - d_k, 0)\, N_f\; |\mathbf U_{\mathrm{eff}}|\;\pi c_t\; (\mathbf U_{\mathrm{eff}}\cdot\mathbf b_f)\,\mathbf b_f , \qquad \mathbf U_{\mathrm{eff}} = \mathbf U + (f_s - 1)(\mathbf U\cdot\mathbf n)\,\mathbf n . \]

Factor Where it comes from
½ρ d max(l − d_k, 0) N_f: twine diameter, bar length less the knot diameter, bars in family f the bar drag factor of TwineCrossFlow
π c_t, with c_t = 0.01 TwineCrossFlow's default Ct_nominal, the 3.2.1 NetStructure value. It is not a parameter of the screen laws (contract C2).
(U_eff·b_f) b_f, the flow along the unit bar direction TwineCrossFlow's tangential velocity. The bars lie in the panel plane, so this equals (U_p·b_f) b_f, with U_p = U − (U·n)n the in-plane component.
|U_eff|, with f_s = √(2 − Sₙ)/(√2(1 − Sₙ)) on the normal component only TwineCrossFlow's speed (Section 7, lead ruling R10), with the law's own clamped Sₙ. At θ = 90° it is |U|.

For any state within the law's clamp range for Sn, the added force equals TwineCrossFlow minus TwineCrossFlow with Ct_nominal = 0 on the same panel. The tests pin that identity (hydrodynamics_PanelLoadLaw_Test.cpp). Below ScreenMF2022's floor (Sn < 0.1005, R38) the two clamp Sn differently (ScreenMF2022 to 0.1005, TwineCrossFlow to 1e-4), so the identity does not hold there (MARE-0146). No new coefficient is introduced.

Bar data. The term uses the bar directions b_u, b_v, the bar length, the knot diameter and the bar counts of Netting. Every net SimObject supplies them to every law through net_element_forces::EvaluatePanelLoad. Without them (hasBarDirections false: a law called on its own, as the A6 validation tests do, or a panel with a zero mesh determinant) the term is zero, as TwineCrossFlow itself is. The law never derives a twine length from the solidity (ME ADR 0003). For a diamond mesh at φ = 45° with equal bar counts, Σ_f (U·b_f) b_f is exactly N U_p, so the force lies along U_p. At other φ it leans towards the bars.

Behaviour.

  • θ = 0: U_p = 0, and the term is exactly zero. The normal-incidence anchors (MF2022 CD(0°), KF2012 Eq. 9, the local C_d) are unchanged.
  • θ = 90°: F_t is the only load. For the WP-A7 panel (one element of 20 × 20 meshes, d = 4 mm, l = 50 mm, φ = 45°, U = 0.5 m/s) it is 0.135 N, against 6.35 N for the old twine model and 4.73 N for TwineCrossFlow.
  • Double counting: the Eq. 14 and Eq. 10 fits reproduce the measured total drag, which already contains the twine friction. For the A7 panel at 45° the term adds 0.6 % (LocalThroughFlow) and 0.7 % (ScreenMF2022) to |F|. ScreenMF2022 then gives about 1 % more than MF2022 Eq. 10 at 45° when bar data are supplied.
  • The term is odd in U and smooth wherever |U_eff| > 10⁻¹⁰ m/s. It enters the automatic-differentiation Jacobian like the rest of the law.

Diagnostics. drag and lift are the projections of the total force on û and L̂. For the in-plane term, F_t·L̂ = −cos θ (F_t·û)/sin θ, computed with the bounded lift direction of TwineCrossFlow. momentumDeficit = drag/(½ρ|U|²) includes the friction, and so does the wake source. localCd is MF2022 Eq. 9 of the total C_D. reynolds, throughFlowSpeed and the flags are those of the law without the term.

Not implemented: the full in-plane twine load. TwineCrossFlow's response to the in-plane flow comes mostly from the cross-flow drag of the bars inclined to it, not from friction. At 80° for the A7 panel, the complete in-plane load (TwineCrossFlow on U_p) is 4.59 N, against 0.134 N of friction. Adding it would bring LocalThroughFlow from −72.5 % to −3.8 % of the old model at 80°. But it also adds 2.42 N at 45°, which the fitted harmonics already cover: LocalThroughFlow would move from −9.4 % to +6.4 %, and ScreenMF2022 would move 22 % above its exact MF2022 45° fit. That variant would need the angle form refitted, and it is an owner decision (MARE-0111).

4. LocalThroughFlow: the default law

LocalThroughFlow.h, which calls kf2012::EvaluateScreen(a3, b4, true, …) in KF2012Common.h. This is the KF2012 screen model evaluated at the arrival velocity Uₙ, using the MF2022 induction factor. Parameters: a3 (default 0.07) and b4 (default 0.10).

Velocity the coefficients are defined on. The input is U∞ (FreeStream). The coefficients c_d and c_l are evaluated at Uₙ = f·U∞, with the factor f² folded into them. The force uses ½ρA|U∞|².

Equations, in the order the code evaluates them:

# Equation Source
1 cos θ = |Û·n| KF2012 Eqs. 20, 22, p. 235
2 r = min(1.08 − 0.97 Sₙ, 1) MF2022 Eq. 11, p. 041301-6; clamp by owner decision (MARE-0109)
3 f = (1 + r)/2, so Uₙ = f·U∞ MF2022 Eq. 7 with U_r = rU (Eq. 5), pp. 041301-5, -4
4 Uₜ = f|U∞|/(1 − Sₙ) MF2022 Eq. 8, p. 041301-5
5 Re = Uₜ t/ν = f|U∞| t/(ν(1 − Sₙ)) KF2012 Eq. 11, p. 223, with U_rel → Uₙ
6 C_D,cyl(Re) = −78.46675 + 254.73873 x − 327.8864 x² + 223.64577 x³ − 87.92234 x⁴ + 20.00769 x⁵ − 2.44894 x⁶ + 0.12479 x⁷, x = log₁₀ Re KF2012 Eq. 10, p. 223 (fit to Goldstein 1965)
7 c_d = f²·C_D,cyl Sₙ(2 − Sₙ)/(2(1 − Sₙ)²) KF2012 Eq. 9 at θ = 0, p. 222, times f²
8 From c_d0 = c_d/f²: C_N(π/4) = c_d0/2; C_T(π/4) = (π/4)·4C_N/(8 + C_N); c_l = f²·(C_N − C_T)/√2 KF2012 §2.5.1, p. 223: Eq. 9 at π/4, Schubauer's Eq. 7 (p. 222), Eq. 2; f² as for c_d, MF2022 p. 041301-7 (lead rulings R1, R59)
9 C_D(θ) = c_d[(1 − a3) cos θ + a3 cos 3θ] KF2012 Eq. 14, p. 223; a1 = 1 − a3, p. 224
10 C_L(θ) = c_l[b2 sin 2θ + b4 sin 4θ], b2 = 1 KF2012 Eq. 14, p. 223; b2 = 1 from Eq. 13 (c_l = C_L(π/4)), p. 223
11 F = ½ρA|U∞|²(C_D û + C_L L̂) KF2012 Eq. 1 and Fig. 3, p. 221

In closed form, at θ = 0:

\[ C_D(0) = f^2\,C_D^{\mathrm{cyl}}\!\left(\frac{f|\mathbf U_\infty|\,t}{\nu(1-S_n)}\right)\frac{S_n(2-S_n)}{2(1-S_n)^2}, \qquad f = \frac{1 + \min(1.08 - 0.97\,S_n,\ 1)}{2}. \]

Step 8 takes c_l from the c_d before f² and then scales it by f², so f² scales c_d and c_l alike (lead rulings R1 and R59, MARE-0207). MF2022 normalise the lift with the same Eq. 9 factor as the drag ("The lift forces were also normalized using Eq. (9), substituting the drag coefficient CD with the lift coefficient CL", p. 041301-7). Before R59 c_l was Schubauer(f²·c_d0), which differs because Schubauer's C_T is not linear in C_N: by −0.1 % at Sₙ 0.2, −0.7 % at 0.36 and about −1 to −3 % at 0.45 to 0.5.

Reynolds number. Re = Uₜ t/ν, with t the twine thickness (Netting::twineThickness). This is KF2012 Eq. 11 evaluated at Uₙ instead of U∞. PanelLoad::reynolds reports the unclamped value.

Validity:

Quantity Range Where it comes from
Sₙ ≤ 0.5 for Eq. 9 "we assume that it holds for Sn ≤ 0.5", KF2012 p. 223
Sₙ 0.18–0.36 for the induction factor r MF2022 Eq. 11 fit, p. 041301-6
Sₙ 0.13–0.317 for a3 and b4 (Rudi data) KF2012 p. 224
Re 10^1.5 ≈ 31.6 to 10⁴ Eq. 10 fit range, KF2012 p. 223
r at Rn ≈ 2000 MF2022 p. 041301-6
θ 0 to π/4 for the cross-flow basis of Eq. 9 KF2012 p. 222
θ 0 to π/2 through the Eq. 14 harmonics KF2012 §2.5, p. 223
θ only θ = 0 for the induction factor MF2022 derived r at θ = 0 and assumed the inclination effect small, p. 041301-7

Outside the range:

  • Sₙ is clamped into [10⁻⁴, 0.5] (kf2012::kMinSolidity, kMaxSolidity) and flag bit 0 is set. The floor is a numerical guard for the 1/Sₙ in MF2022 Eq. 9, not physics.
  • Re is clamped into [10^1.5, 10⁴] before Eq. 10 and flag bit 1 is set. At the ends of that range, C_D,cyl = 1.765 and 1.092.
  • |U| < 10⁻¹⁰ m/s: the floor replaces |U| in û and flag bit 2 is set. The force tends to zero as |U|².
  • r (Eq. 11) is extrapolated linearly outside Sₙ ∈ [0.18, 0.36], but never above 1. Below Sₙ = 0.08/0.97 ≈ 0.0825 Eq. 11 gives r > 1, which would speed the flow up at the panel; there r = 1, so f = 1 and the law is KF2012 without induction, and flag bit 3 is set (owner decision 2026-09-27, MARE-0109). The comparison is on the value, so the clamped branch has a zero derivative. The same clamp holds for the r in localCd and throughFlowSpeed of every law, and bit 3 is set wherever r is clamped, also where r enters the diagnostics only (ScreenKF2012 without induction, TwineCrossFlow). ScreenMF2022 never sets it: its solidity floor 0.1005 (Section 9) lies above 0.0825.
  • C_D(90°) = 0 for the harmonics (Section 9). The load along the panel comes from the in-plane twine friction of Section 3.1 alone, and only when the netting has bar data.

AtPanel is rejected: the law adds the panel's own induction itself (Accepts, PanelLoadLaw.h; ME ADR 0004).

5. ScreenKF2012: the paper's screen model

ScreenKF2012.h, which calls kf2012::EvaluateScreen(a3, b4, useInduction, …). Parameters: a3 (default 0), b4 (default 0) and useInduction (default false).

With the defaults this is KF2012 as published, fed U∞: f = 1 in Section 4, so

  • Re = |U∞| t/(ν(1 − Sₙ)) (KF2012 Eq. 11, p. 223);
  • c_d = C_D,cyl(Re)·Sₙ(2 − Sₙ)/(2(1 − Sₙ)²) (Eq. 9, p. 222);
  • c_l follows from c_d (§2.5.1, p. 223);
  • C_D and C_L follow from Eq. 14 with the chosen a3 and b4;
  • the force is Eq. 1;
  • Uₜ = |U∞|/(1 − Sₙ) (MF2022 Eq. 6, p. 041301-4).

a3 = b4 = 0 is the first-harmonic model C_D = c_d cos θ and C_L = c_l sin 2θ, the angle form of Løland's formulas (KF2012 §2.5.2, p. 223). useInduction = true makes ScreenKF2012{a3, b4, true} identical to LocalThroughFlow{a3, b4}.

Validity, clamps and flags are those of Section 4, except the rows that concern r. AtPanel is accepted only when useInduction is false (lead ruling R8): with induction off, the law adds none of its own, so a velocity that already contains it is not counted twice.

6. ScreenMF2022: the towing-tank coefficients

ScreenMF2022.h. This law has no parameters.

Velocity the coefficients are defined on. U∞, the towing velocity. MF2022 define C_D and C_L on the netting rectangle area and the relative velocity U between panel and water (Eq. 3, p. 041301-4). The coefficients include the panel's own induction, so AtPanel is rejected (ME ADR 0004).

Equations:

# Equation Source
1 CD(0°) = 1.782 Sₙ² + 1.057 Sₙ − 0.053 MF2022 Eq. 10, p. 041301-5
2 CD(45°) = 1.165 Sₙ − 0.0919 MF2022 Eq. 10, p. 041301-5
3 CL(45°) = 1.693 Sₙ² − 0.217 Sₙ + 0.022 MF2022 Eq. 10, p. 041301-5
4 C_D(θ) = CD0[(1 − a3) cos θ + a3 cos 3θ], with a3 = (1 − √2·CD45/CD0)/2 KF2012 Eq. 14 form, p. 223; a3 solved so that C_D(45°) = CD(45°)
5 C_L(θ) = CL45 sin 2θ (b2 = 1, b4 = 0) KF2012 Eq. 14 form; MF2022 measured lift at 45° only, so b4 cannot be fixed from it
6 F = ½ρA|U∞|²(C_D û + C_L L̂), with C_L L̂ = 2 CL45[(û·ñ)ñ − (û·ñ)²û] MF2022 Eq. 3; KF2012 Eq. 1, Fig. 3
7 Rn = |U∞| t/ν MF2022 Eq. 4, p. 041301-4
8 Uₜ = |U∞|(1 + r)/(2(1 − Sₙ)), with r = min(1.08 − 0.97 Sₙ, 1) from MF2022 Eq. 11 MF2022 Eq. 8, p. 041301-5 (diagnostic only)

The code computes C_D·a3 = (CD0 − √2·CD45)/2 without dividing by CD0.

Reynolds number. Rn = |U∞| t/ν (MF2022 Eq. 4). The coefficients do not depend on it. Eq. 10 is the Rn = 2000 fit, and Rn is only reported in PanelLoad::reynolds. It is never clamped, and flag bit 1 is never set. See Section 11.

Validity:

Quantity Range Source
Sₙ 0.18 to 0.36, image-measured (Snm) MF2022 Eq. 10, p. 041301-5
Rn the fit is at Rn = 2000 MF2022 p. 041301-5
Rn local C_d roughly constant for Rn > 1000–1500 MF2022 Figs. 14–15, p. 041301-7
θ measured at 0° and 45° only MF2022 pp. 041301-3, -4
θ between 0° and 45°, interpolated by the harmonic form
θ beyond 45°, extrapolated
θ C_D(90°) = 0 for Eq. 10's form; the in-plane friction of Section 3.1 remains

Outside the range:

  • Sₙ is clamped into [0.1005001, 0.5] (screen_mf2022::kMinSolidity, kMaxSolidity) and flag bit 0 is set. The floor is the owner's decision (Q5 and QG1, 2026-09-27; MARE-0130): clamp only as far as needed for C_D(θ) ≥ 0 at every θ. C_D(θ) = CD0 cos θ (1 − 4a3 + 4a3 cos²θ) is negative where cos²θ < (4a3 − 1)/(4a3), so it is non-negative for all θ ∈ [0°, 90°] if and only if a3 ≤ ¼, that is CD0 ≤ 2√2·CD45. With Eq. 10 the equality is 1.782 Sₙ² + (1.057 − 2√2·1.165) Sₙ + (2√2·0.0919 − 0.053) = 0, with roots Sₙ = 0.100500148638665 and 1.155458 (outside (0, 0.5]); a3 is below ¼ on (0.1005, 0.5] (a3 = 0.066 at Sₙ = 0.2, 0.123 at 0.5). The floor is the smaller root. It lies above the Eq. 10 roots Sₙ = 0.0919/1.165 = 0.07888412 for CD(45°) and Sₙ = (−1.057 + √(1.057² + 4·1.782·0.053))/(2·1.782) = 0.04649703 for CD(0°) (the other root, −0.6397, is negative), which the first floor (Q5 alone) used; there C_D(60°) was −0.0104. CL(45°) has no real root (discriminant 0.217² − 4·1.693·0.022 = −0.1019) and is at least 0.01505, at Sₙ = 0.0641.
  • Between the floor and the fit range, the polynomials are extrapolated.
  • At setup, WarnIfOutsideFitRange (PanelLoadLaw.h) logs a warning on HydroModel for a solidity outside [0.18, 0.36], and says so when the solidity is below the floor 0.100500 and will be clamped. Net/NetStructure and Net/NetStructureWithConstraints call it (through net_panel_setup) for every distinct fixed solidity and, with SolidityModel = MeshOpening, for the smallest and largest solidity at the initial state.
  • |U|² < (10⁻⁹)² m²/s²: |U| is replaced by 10⁻⁹ in divisions and flag bit 2 is set.

7. TwineCrossFlow: bar-by-bar cross-flow

TwineCrossFlow.h. This is the present NetStructure twine model, copied out of net_element_forces::CalcHydroDynamicForces in NetElement3NForces.h (MARE-0091). It is the only law that uses the mesh-bar directions, which suits diamond trawl meshes. It is not the default. Parameters: see Section 12.

Velocity the coefficients are defined on. The effective velocity U_eff: U∞ with the solidity speed-up applied to its normal component only (plan §A1; lead ruling R10):

\[ \mathbf U_{\mathrm{eff}} = \mathbf U + (f_s - 1)(\mathbf U\cdot\mathbf n)\,\mathbf n, \qquad f_s = \frac{\sqrt{2-S_n}}{\sqrt2\,(1-S_n)} . \]

f_s² = (2 − Sₙ)/(2(1 − Sₙ)²) is the ratio of KF2012 Eq. 9 (p. 222) to the single-cylinder value C_D,cyl·Sₙ. The speed-up therefore reproduces Eq. 9 at normal incidence. It is a through-flow speed-up, not the MF2022 induction factor. This law has no r, and Accepts takes AtPanel for it. The original CalcVelocities scaled the whole vector. At normal incidence the two agree exactly (tests/hydrodynamics_TwineCrossFlow_Test.cpp).

Reynolds number (MARE-0085):

\[ \mathrm{Re} = \frac{|\mathbf U_{\mathrm{eff}}|\sqrt2}{\sqrt{2-S_n}}\,\frac{d}{\nu} \]

with d the twine diameter (twineThickness). At normal incidence this is |U|d/(ν(1 − Sₙ)), KF2012 Eq. 11 and MF2022 Eq. 6. It is also throughFlowSpeed·d/ν.

Forces, per bar family (barU with numBarsU bars, barV with numBarsV). α is the angle between U_eff and the bars, U_⊥ and U_∥ are the components of U_eff across and along the bars, and L_b = max(l − d_k, 0) is the bar length l less the knot diameter d_k:

# Equation Source
1 F_⊥ = ½ρ d L_b N · C_n · |U_eff| · U_⊥ cross-flow principle
2 C_n = C_D,cyl(Re_c)·sin α with Re_c = Re clamped into [32, 10⁴], so |F_⊥| = ½ρdL_bN·C_D,cyl|U_eff|² sin²α KF2012 Eq. 10, p. 223; the clamp is owner ruling R58
7 F_∥ = ½ρ d L_b N · π·Ct_nominal · |U_eff| · U_∥ (tangential skin friction) constant, as in the original
8 F_k = ½ρ N_k·CnKnots_nominal·(πd_k²/4)·|U_eff|·U_eff (knots, along U_eff) as in the original

The total force is the sum over both families plus the knots. drag and lift are the projections of that force on û and L̂. A force component normal to both, which asymmetric bar directions can give, appears in force only. The panel area enters only localCd and momentumDeficit.

Validity. The polynomial holds for 32 ≤ Re < 10⁴ (KF2012 p. 223). θ and α are unrestricted.

Outside the range:

  • Re is clamped into [32, 10⁴] for the polynomial and flag bit 1 is set; reynolds reports the unclamped value. C_n is continuous in Re (owner ruling R58, MARE-0200), as in the KF2012 laws. The original, and this law before R58, switched to the Ersdal and Faltinsen (2006) linear and cross-flow models outside the range (parameters CnLinearLimitAngle, CnLinear, CnTurb, CnLam, TurbLimit, LamLimit, no longer read), with C_n = 1.15 sin α near normal incidence: a step of −35 % where Re fell below 32 (C_D,cyl(32) = 1.758), +5 % above 10⁴ (C_D,cyl(10⁴) = 1.092), and NaN angles above 2·10⁵ (MARE-0108, resolved with R58).
  • Sₙ is clamped into [10⁻⁴, 0.5], NaN included, and flag bit 0 is set.
  • localCd uses r = min(1.08 − 0.97 Sₙ, 1); below Sₙ ≈ 0.0825 flag bit 3 is set. The force does not use r.
  • |U| < 10⁻¹⁰ m/s sets flag bit 2. |U_eff| is bounded into [10⁻¹⁰, 10¹⁰] m/s, and each bar drag factor into ±10¹⁰⁰.
  • Without bar directions (hasBarDirections == false), Evaluate returns a zero load with finite fields. The caller raises the setup error (lead ruling R11).

8. Induction

A net slows the flow upstream of itself and through itself. That is induction, and it belongs to the load law (CONTEXT.md). MF2022 model it with an actuator disc (Taylor/Glauert, p. 041301-4): half of the velocity reduction happens before the panel, so the flow arriving at the panel is Uₙ = ½(U + U_r) (Eq. 7, p. 041301-5). The wake ratio r = U_r/U is fitted by Eq. 11, p. 041301-6. That gives f = Uₙ/U = (1 + r)/2 and Uₜ = U(1 + r)/(2(1 − Sₙ)) (Eq. 8).

As implemented (lead ruling R1). In LocalThroughFlow, and in ScreenKF2012 with useInduction, f scales the whole velocity at which KF2012 Eqs. 9–11 are evaluated. Re_t = f·Re, and c_d is multiplied by f² before c_l is derived from it. The f² factor scales c_d and c_l independently of θ. MF2022 derived (1 + r)/2 at θ = 0 only and assumed the inclination effect small (p. 041301-7). The default a3 = 0.07 was fitted under this scaling (Section 9).

Untested alternative: induction on the normal component only. One could argue that only the normal component is blocked. Then Uₙ = U + (f − 1)(U·n)n, which changes the inflow angle at the panel and scales C_N but not the in-plane flow. The plan's first draft proposed this. It is not implemented and not tested. Adopting it would change C_D(θ) at every θ > 0, so a3 (and probably b4) would have to be refitted against MF2022's 45° data before it could be used. TwineCrossFlow's normal-component speed-up is a different thing: it is the through-flow speed-up of KF2012 Eq. 9, not the MF2022 induction (Section 7; lead ruling R10).

Numbers. f² = 1 below Sₙ ≈ 0.0825 (r clamped to 1, Section 4), and f² = 0.98, 0.91, 0.80, 0.75 and 0.64 at Sₙ = 0.1, 0.18, 0.3, 0.36 and 0.5. For the MF2022 nets (Snm = 0.185–0.364), the factor on c_d is 0.90–0.75. The lower Re_t = f·Re changes C_D,cyl on top of that.

9. Angle harmonics: a3 and b4

KF2012 write C_D and C_L as Fourier series in θ (Eq. 12, p. 223), normalised by c_d = C_D(0) and c_l = C_L(π/4) (Eq. 13). They keep one extra term each (Eq. 14, p. 223):

\[ C_D(\theta) = c_d\left[(1-a_3)\cos\theta + a_3\cos3\theta\right],\qquad C_L(\theta) = c_l\left[b_2\sin2\theta + b_4\sin4\theta\right]. \]

a1 = 1 − a3 keeps C_D(0) = c_d (p. 224). b2 = 1 follows from Eq. 13, because sin 4θ = 0 at π/4 (lead ruling R8). Both forms give C_D(π/2) = 0 and C_L(0) = C_L(π/2) = 0 (p. 223). a3 > 0 lowers drag at intermediate angles; b4 > 0 moves the lift maximum below 45° (p. 224).

Bounds (MARE-0137, owner ruling R42). With cos 3θ = 4cos³θ − 3cos θ the drag factor is C_D/c_d = cos θ (1 − 4a3 + 4a3 cos²θ), which is negative for cos²θ < (4a3 − 1)/(4a3): for every a3 > 1/4 there is a band of grazing angles with negative drag (a3 = 0.3: above 66°). A negatively dragged panel is pushed upstream, and its momentum deficit is negative, so its wake would speed the flow up. Grazing angles are common: trawl panels lie nearly along the tow, and the side panels of a cage sit at 75–90° to the current. Likewise C_L/(c_l sin θ cos θ) = 2b2 + 4b4 cos 2θ changes sign near 90° for b4 > 1/2 and near 0° for b4 < −1/2. ReadPanelLoadLaw therefore rejects HydroA3 > 0.25 and |HydroB4| > 0.5 at setup for LocalThroughFlow and ScreenKF2012 (the bounds themselves are accepted; kf2012::kMaxA3, kf2012::kMaxAbsB4). The limit a3 = 1/4 is also the upper end of the Schubauer range below and the bound the ScreenMF2022 solidity floor enforces for its fitted a3 (Section 6). At the other end, d(C_D/c_d)/d(cos θ) at θ = 0 is 1 + 8a3, so for a3 < −1/8 C_D is no longer largest at normal incidence (KF2012 p. 223); HydroA3 below −0.125 is rejected too (kf2012::kMinA3), and so is a harmonic that is not finite (lead ruling R60, MARE-0208). ScreenMF2022 and TwineCrossFlow do not read the parameters.

What the literature gives:

  • Rudi 1988 (KF2012 Fig. 5, p. 224), Sₙ = 0.130–0.317 at 0–90°. The measured drag falls below cos θ for θ ≤ 45°, with a3 ≈ 0.1 fitting Sₙ = 0.317. KF2012 plot a3 = b4 = 0.1.
  • Schubauer 1950 theory (KF2012 p. 225): 0.15 ≲ a3 ≤ 0.25 and 0.11 ≲ b4 ≲ 0.22. The best fit is a3 ≈ 0.15 and b4 ≈ 0.12 for Sₙ ≤ 0.5, but those screens have Sₙ = 0.33–0.78.
  • Zhan 2006 cylinder comparison (KF2012 Fig. 7, p. 226): a3 should be below 0.1, but not zero.

Choices in the code:

Law a3 b4 How it was chosen
LocalThroughFlow 0.07 0.10 a3 from MF2022 Eq. 10: C_D(45°)/C_D(0) = (1 − 2a3)/√2 = 0.61 at N19a gives a3 = 0.07, with f² θ-independent (Section 8). b4 from KF2012 §2.5.2 and Fig. 5 (Rudi).
ScreenKF2012 0 0 The first-harmonic model, KF2012 as published. Set with HydroA3, HydroB4.
ScreenMF2022 per solidity, (1 − √2·CD45/CD0)/2 0 Fitted exactly to Eq. 10 at 45°. MF2022 has no lift data away from 45°.

The a3 that ScreenMF2022 fits for each MF2022 Table 2 net (Snm from Table 2, p. 041301-3; CD0 and CD45 from Eq. 10):

Net Snm CD(0°) CD(45°) CD45/CD0 a3
N18b 0.185 0.2035 0.1236 0.607 0.071
N19a 0.193 0.2174 0.1329 0.612 0.068
N20b 0.199 0.2279 0.1399 0.614 0.066
N26b 0.257 0.3363 0.2075 0.617 0.064
N26a 0.262 0.3463 0.2133 0.616 0.064
N33b 0.328 0.4854 0.2902 0.598 0.077
N33a 0.331 0.4921 0.2937 0.597 0.078
N36a 0.364 0.5679 0.3322 0.585 0.086

The default a3 = 0.07 sits inside the MF2022 spread (0.064–0.086), near its low-solidity end. Whether one a3 also fits the independent angle data (Rudi, Zhan 30°/60°) is test L9 of the plan (WP-A6), with a least-squares refit over all three datasets in the validation report.

It does not: the two-harmonic form misfits (disclosed by owner decision, 2026-09-27). Against MF2022 the default law's lift at 45° is 26–31 % low for the high-solidity nets, and against Rudi, Løland and Zhan its angle dependence at 60–80° is too weak. The refit (a3 = 0.046, b4 = 0.050) leaves as many L5/L8 checks failing (16 of 66) as the defaults, so no choice of a3 and b4 fixes it; the form itself has too few terms. The owner chose to disclose this now and to replace the angle form later (MARE-0131). The numbers and the disabled tests are in Section 11.4.

10. Solidity

Solidity Sₙ is the fraction of the panel area that is twine and knots. Every law takes it as an input value and never computes or converts it (ME ADR 0003). The definitions in use differ by up to about 25 % for the same netting:

Definition Formula Source Notes
Twine-only estimate Sₑ = 2t/s (t twine thickness, s mesh side) MF2022 Eq. 1, p. 041301-3; Zhan's s = 2d/Δl, p. 92 Manual measurement; no knot term, no overlap
Cylinder solidity S_c = 2t/s − (t/s)² MF2022 p. 041301-3; KF2012 Fig. 1, p. 219 (Sn = 2d_w/l_w − (d_w/l_w)²) Crossing cylinders, overlap counted once, no extra material at the knots
Image-measured Snm, from backlit machine-vision images at the towing mesh side MF2022 p. 041301-3, Table 2 Includes knots. 2–27 % above Sₑ for MF2022's nets
Knot factor, MF2022 K = Snm/S_c MF2022 Eq. 2, p. 041301-3 1.08–1.11 for most nets, 1.16–1.23 for super-knot (R3S) netting
Knot factor, this library K = S/(2t/s) CONTEXT.md; the caller's MeshOpening model, S = K·t/(L₀ sin φ cos φ) (plan §A3; ME ADR 0003) At φ = 45°, t/(L₀ sin φ cos φ) = 2t/L₀. So this K is relative to 2t/s, not to S_c

The two knot factors are not interchangeable: K_library = K_MF2022·(1 − t/(2s)). For N33a (t/s ≈ 0.148), MF2022's K = 1.21 corresponds to K_library ≈ 1.12. The legacy twine code used 1.1·d/(L₀ sin φ cos φ) (ME ADR 0003).

Which definition each law assumes:

  • ScreenMF2022 and the induction factor r: image-measured Snm (MF2022 Eqs. 10 and 11).
  • LocalThroughFlow: its absolute level is anchored to MF2022 (ME ADR 0005), so Snm.
  • ScreenKF2012: the projected-area solidity of KF2012 (p. 219), which is S_c for a square mesh. KF2012 do not consider knots (p. 219).
  • TwineCrossFlow: the loads come from the twine geometry (d, bar length, knots, bar counts). Sₙ enters only the speed-up f_s and localCd.

Why the caller owns it (ME ADR 0003). How solidity is defined moves the load as much as the choice of law does. How it should follow mesh deformation depends on the structure, not on the law. With one definition per simulation, visible in the input, switching the law changes only the law. Solidity also enters the automatic-differentiation Jacobian where it is computed. Feeding 2t/s to a law fitted to image-measured solidity is the user's error to avoid, and gives lower loads. The caller-side options (SolidityModel, Solidity, KnotFactor, per-element Sn) are documented with the SimObjects (Section 12).

11. Known disagreements and open items

11.1 MF2022 against Zhan 2006 at normal incidence

At the same nominal solidity, the two towing-tank datasets differ by about 15 %. The figures below come from the Section 4 and 5 formulas at θ = 0:

  • MF2022 at Rn = 2000, all eight Table 2 nets, against Eq. 10;
  • Zhan 2006 Table 1–3 R0, all three nets at 0.25–1.0 m/s, with Sₙ = s = 2d/Δl (K = 1), ρ = 1000 kg/m³, ν = 1.008·10⁻⁶ m²/s and A = 1.3 × 0.7 m².
Law MF2022 Zhan 2006
KF2012 Eq. 9, no induction (ScreenKF2012) +16 to +27 % −4 to +10 % (0.5–1.0 m/s)
With MF2022 induction (LocalThroughFlow) −7 to +7 % −18 to 0 %, mean −9 % (−16 to 0 %, mean −7 % at 0.5–1.0 m/s)

Likely causes:

  • Solidity definition. MF2022 measure Snm from images, knots included: 2–27 % above 2t/s, with MF2022 K = 1.08–1.23 (p. 041301-3). Zhan use s = 2d/Δl with no knot term (p. 92). Zhan do not say whether their nets are knotted.
  • Tank blockage. The Zhan panel (1.3 × 0.7 m) blocks about 5 % of the tank section (6 m wide, at most 3 m deep; p. 92). The MF2022 panel (1.215 × 0.985 m) blocks about 2 % (10.5 × 5.6 m; p. 041301-3). Blockage alone could explain most of the gap. Applying both a knot factor and a blockage correction would overshoot.
  • Balance accuracy. Zhan state errors below 5 % (p. 92).

Anchor. MF2022 is the anchor dataset (ME ADR 0005, Accepted; owner question Q1). Absolute load levels are asserted tightly only against MF2022. Zhan, Løland and KF2012 are asserted at the ±20 % inter-dataset spread at K = 1. K = 1.16 for the Zhan nets is a reconciliation hypothesis: it is reported, never asserted (lead ruling R2). Ratios that do not depend on the solidity definition or on blockage (R30/R0, R60/R0, the speed trend) are asserted tightly on every dataset.

Against Løland's C_D(0) (KF2012 Eq. 4, p. 222: C_D = 0.04 + (−0.04 + 0.33Sₙ + 6.54Sₙ² − 4.88Sₙ³) cos θ), which has no Re dependence, the gap depends on Re. With Rn = |U|t/ν the default law gives:

Sₙ Rn = 500 Rn = 1000 Rn = 2000
0.2 −3 % −15 % −17 %
0.3 −18 % −27 % −28 %

KF2012 find that Eq. 9 without induction matches Løland reasonably for Re ≳ 500 (p. 223).

The MF2022 text lift for N19a at 45°, 1.75 m/s is 102 N (p. 041301-5). Eq. 10 gives 79 N, −23 %, at Rn ≈ 1225, below the fit's Rn = 2000. MF2022 note that lift is net-dependent (p. 041301-7).

11.2 ScreenMF2022 has no Reynolds dependence

Eq. 10 is the Rn = 2000 fit. MF2022 report coefficients that rise as Rn falls, especially below Rn = 500 (Figs. 9–11, 14–16, pp. 041301-6, -7). They also note that no panel's drag grows with U² (p. 041301-5). ScreenMF2022 reproduces none of this. At model-scale speeds and thin twines (Rn of a few hundred) it underpredicts. The plan's speed-trend test L3 is therefore asserted for the default law only. The Re-dependent laws are LocalThroughFlow and ScreenKF2012, through KF2012 Eq. 10.

11.3 TwineCrossFlow above LamLimit (MARE-0108, resolved)

Before owner ruling R58 the Ersdal-Faltinsen branch compared the bar angle with asin(Re/TurbLimit) and asin(Re/LamLimit), which are NaN above 3.4·10⁵ and 2·10⁵. Since R58 the law holds the cylinder polynomial at its end value above Re = 10⁴ (Section 7), so the branch and its NaN are gone: MARE-0108.

11.4 The default law's angle form misfits lift and 60–80° (MARE-0110)

The default law, LocalThroughFlow, takes its angle dependence from the two-harmonic KF2012 Eq. 14 form (Section 9). That form misfits MF2022's lift at high solidity and the angle dependence of Rudi, Løland and Zhan at 60–80°. On 2026-09-27 the owner decided to disclose this now and to replace the angle form later (OWNER_QUESTIONS Q11; the replacement is MARE-0131). Until then the failing tests stay DISABLED_, and nothing (law, a3, b4 or tolerance) is tuned to make them pass (lead ruling R20). The numbers, from the A6 tests (MARE-0110):

  • Lift at high solidity against MF2022. CL(45°) is 26–31 % below Eq. 10 at Rn 2000 for N33a, N36a and N33b (−26.1, −30.8 and −25.6 %; tolerance 25 %; L1). The N33a lift at 45° and 1.75 m/s is 196 N against the 271 N of the text (−27.6 %; tolerance 15 %; L2). ScreenMF2022 gives 79 N against 102 N for N19a (−22.6 %, at Rn 1225, below the fit Rn).
  • Angle dependence at 60–80°. Rudi 1988: the drag ratio C_D(θ)/C_D(0) at 60–80° is low by up to 0.154, and the lift ratio C_L(θ)/C_L(45°) at 30, 60 and 80° low by up to 0.358 (tolerance 0.08; L5). Løland 1991: C_L is outside ±25 % in 31 of 80 rows (L6). Zhan 2006 at K = 1: R60/R0 is off by up to −0.184 (model 0.395 against 0.377–0.579), R30/R0 at 0.75 m/s by +0.131 (tolerance 0.10), and the speed trend at 30° and 60° by up to +38.7 % (tolerance 10 %; L8).
  • A refit does not remove it. The least-squares refit over MF2022, Rudi and Zhan gives a3 = 0.046 and b4 = 0.050 (per dataset a3 = 0.072, 0.035 and 0.039). 16 of the 66 L5/L8 checks fail at the defaults and 16 at the refit (L9): the two-harmonic form itself misfits, not its parameter values.
  • At normal incidence, two further disabled tests are not about the angle form: localCd at 0° rises to 0.93–0.96 at Rn 3750–5000 (N18b, N20b) against the 0.8 plateau (tolerance 0.12; L4), and C_D(0) is 30 % below Løland at Sₙ 0.317, Re 2000 (L6).

What passes, as measured / model: L1 C_D 0.935–1.074, L2 drag 0.937–0.989, L3 0.845–1.181 and the L8 absolute R0 0.996–1.184. Drag at normal incidence and at 45° agrees with MF2022 within 7 %; lift, and every load on a panel at 60–80°, does not. In a structure this affects inclined panels, so the deformed shape of a cage more than its drag, and the steep panels of a trawl.

The 11 disabled tests (run them with --gtest_also_run_disabled_tests --gtest_filter=PanelLoadLaw*): PanelLoadLaw_MF2022.DISABLED_L1_Eq10LiftAtRn2000_LocalThroughFlow, DISABLED_L2_TextLiftAt1p75_LocalThroughFlow, DISABLED_L2_TextLiftAt1p75_ScreenMF2022, DISABLED_L4_LocalCdPlateauAt0Deg; PanelLoadLaw_Rudi.DISABLED_L5_DragAngleDependence_LocalThroughFlow, DISABLED_L5_LiftAngleDependence_LocalThroughFlow; PanelLoadLaw_Loland.DISABLED_L6_DragAtNormalIncidence_LocalThroughFlow, DISABLED_L6_LiftCoefficient_LocalThroughFlow; PanelLoadLaw_Zhan.DISABLED_L8_AngleRatios_LocalThroughFlow, DISABLED_L8_SpeedTrendAt30And60Deg_LocalThroughFlow; and PanelLoadLaw_Consistency.DISABLED_L9_DefaultHarmonicsSatisfyL5AndL8. The towed panel through the SimObject repeats three of them (NetValidation_TowedPanel_VALIDATION.DISABLED_S1_L2_TextLiftAt1p75, DISABLED_S1_L8_AngleRatios, DISABLED_S1_L8_SpeedTrendAt30And60Deg). The validation report shows every row: the pages Validation: MF2022, Validation: Rudi and Løland, Validation: Zhan 2006 and L9 fit of the fhsim_marine_elements documentation.

12. Parameters

hydrodynamics::ReadPanelLoadLaw and hydrodynamics::ReadFluid (PanelLoadLaw.h) read these parameters. A parameter is read only for a law that has it. An absent parameter keeps the law's default.

Name Type, unit Default Law Meaning
HydroModel string LocalThroughFlow all LocalThroughFlow, ScreenKF2012, ScreenMF2022 or TwineCrossFlow. Any other value is a setup error.
HydroA3 double, – 0.07 (LocalThroughFlow), 0 (ScreenKF2012) LocalThroughFlow, ScreenKF2012 Third drag harmonic a3, KF2012 Eq. 14. a3 outside −0.125 to 0.25, or not finite, is a setup error (Section 9)
HydroB4 double, – 0.10 (LocalThroughFlow), 0 (ScreenKF2012) LocalThroughFlow, ScreenKF2012 Fourth lift harmonic b4, KF2012 Eq. 14. |b4| > 0.5 is a setup error (Section 9)
HydroInduction bool false ScreenKF2012 Apply the MF2022 induction factor f = (1 + r)/2. LocalThroughFlow always applies it.
Rho double, kg/m³ 1025 all Water density. MF2022 used 998, Zhan 2006 1000.
Nu double, m²/s 1.19·10⁻⁶ all Kinematic viscosity. MF2022 used 10⁻⁶ at 20 °C (p. 041301-4).
Ct_nominal double, – 0.01 TwineCrossFlow Tangential drag coefficient, multiplied by π
CnKnots_nominal double, – 0.4 TwineCrossFlow Knot drag coefficient on πd_k²/4

ScreenMF2022 has no parameters. HydroA3 and HydroB4 are ignored for it.

The TwineCrossFlow defaults are the values hard-coded in the 3.2.1 fhsim_marine_elements NetStructure::CreateNetPanels (main, src/net/NetStructure.cpp:219-233) (lead ruling R16). The Rho and Nu defaults are the values hard-coded there in 3.2.1.

SimObject parameters. The parameters that belong to each SimObject have their tables on that SimObject's page, and the fhsim_marine_elements user guide (Net hydrodynamics: user guide) collects them: which SimObjects read the parameters above, solidity (SolidityModel, Solidity, KnotFactor, per-element Sn), and wake casting (CastWake, Wake*).

13. Limitations

  • Waves and KC. All coefficients come from steady tows or steady current. In waves, the laws are applied quasi-statically to the instantaneous relative velocity, which KF2012 consider applicable (p. 218). There is no Keulegan–Carpenter dependence, no history effect and no wave-induced change of the wake or of r.
  • Deformation-dependent solidity. The coefficients were measured on rigid, framed panels. How Sₙ follows the mesh opening is the caller's choice (SolidityModel). With Fixed, it does not follow at all. With MeshOpening, it follows t/(L₀ sin φ cos φ), whose knot factor is only a constant. L₀ and t are the unstretched bar length and twine diameter, by owner decision (MARE-0113), because stretching also thins the twine; the laws load the deformed panel area, so at a fixed φ the load grows with the square of the bar stretch.
  • Flow in a trawl cone. Each panel is treated as an isolated flat screen in a uniform stream. The flow deflection, acceleration and pressure field inside a converging net cone are not modelled, except through the environment wake of upstream panels. Along the panel the screen laws carry only the twine friction of Section 3.1, about 2–3 % of the old twine model's load at 90°. The cross-flow drag of bars inclined to an in-plane flow is not in them (MARE-0111). Their angle dependence is validated only to 45° (MF2022), 60° (Zhan) and 90° (Rudi, as normalised curves). For panels near grazing incidence, which dominate a trawl, only TwineCrossFlow has the full in-plane twine load.
  • Angle form of the default law. The two-harmonic KF2012 Eq. 14 form gives 26–31 % too little lift at 45° for Sₙ ≈ 0.33–0.36 against MF2022, and too weak an angle dependence at 60–80° against Rudi, Løland and Zhan; refitting a3 and b4 does not help (Section 11.4). The owner disclosed this on 2026-09-27 and will have the form replaced (MARE-0131); 11 load-law tests stay disabled until then (MARE-0110).
  • No added mass. The laws return viscous drag and lift only. The added-mass force of an oscillating panel, in phase with the relative acceleration (KF2012 p. 220), is not modelled.
  • Induction at inclination. r and f are fitted at θ = 0 and applied unchanged at every θ (Section 8).
  • Wake inside a net. Only the net's own panels and cable elements see its internal wake (the private field); separate SimObjects inside the net see lumped sources only (QF8; Wakes). The lumped source carries the felt drag, 3.7 % less shading of a second cage than the old panel sum (QF14).
  • Laboratory scale. The data span Rn of roughly 100–5000 and Sₙ of 0.13–0.36. Full-scale cages have higher twine Reynolds numbers, where KF2012 Eq. 10 is clamped at Re = 10⁴.

14. Shape laws

A shape law is the load of the water on a body of one simple shape. It is free of any SimObject state: the body hands it its own velocity v relative to the water (v = body velocity − water velocity, NED) and gets a force on itself. Each law also answers what a wake caster asks of a body: its drag at the free stream, its frontal area and the centre of its rear face.

14.1 Sphere

environment::sphere_hydro, SphereHydro.h (ENV-0091).

Quantity Expression Source
Drag F = −K |v| v, K = ⅛ ρ π C_d D (D − d/π), D the diameter, d the diameter of a cable through the sphere (0 when free) fhsim_marine_elements SphereBase::DragForce, verbatim
Jacobian ∂F_i/∂v_j = −K (δ_ij |v| + v_i v_j / |v|); 0 at rest
Added mass C_a ρ V, C_a = 0.5 DNV-RP-C205 (2021) App. A, Table A-2
Wave excitation (1 + C_a) ρ V f a, f the wet fraction, a the particle acceleration owner ruling R67
Wake M = 2K/ρ = C_d πD²/4 (1 − d/(πD)), area πD²/4, rear centre D/2 downstream

14.2 Disc

environment::disk_hydro, DiskHydro.h (ENV-0101), moved from fhsim_marine_elements' DiskBase and disk_drag (lead ruling R24, MARE-0098).

The relative velocity is split along the unit axis n: v_n = (n·v) n and v_t = v − v_n. Each part has its own coefficient, area and speed:

F = −½ρ C_n A_n |v_n| v_n − ½ρ C_t A_t |v_t| v_t, A_n = π/4 (D² − d²), A_t = (D − d) T,

with D the diameter, T the thickness and d the diameter of a cable through the disc. The face area A_n is the annulus outside the cable (ENV-0103): the cable runs along the axis and covers exactly πd²/4 of the face. DiskBase had π/4 D (D − d/π), the sphere's correction for a cable across the flow (14.1), which does not apply to a disc; fhsim_marine_elements' net-cable discs already used the annulus (MARE-0074) and now call DragForceNormal. The defaults of Disk are those of Net/Disk: C_n = 1.2, C_t = 0.005, D = 1 m, T = 0.1 m, but d = 0 (a free disc). DragVelocityJacobian is the exact derivative, |w| M + w wᵀ/|w| per part with M its projector, and 0 where a part vanishes.

For a wake, the silhouette normal to the flow direction ê is the face ellipse plus the edge rectangle, A = π(D² − d²)/4 |n·ê| + D T √(1 − (n·ê)²) (face on the annulus of the drag; the cable casts nothing), and the disc reaches T/2 |n·ê| + D/2 √(1 − (n·ê)²) downstream of its centre (FrontalArea, RearReach; Net/Disk's CurrentLoad). BodyLoad gives M = F·ê/(½ρ|U|²) at the local inflow U, which face-on is C_n A_n.

The scalar function DragForceTangential is DiskBase's expression, bit for bit; DragForceNormal is DiskBase's with the annulus. DiskBase named their velocity parameters the wrong way round (the tangential function's was called Vnormal); here each is named for what it takes.

14.3 Cylinder element

environment::cylinder_hydro, CylinderHydro.h (ENV-0101), from fhsim_marine_elements' CableHydrodynamics.h (MARE-0322) and fhsim_base's CCable.

Cd is a function of the cross-flow Reynolds number Re_n = |v_n| D / ν, v_n the part of v normal to the axis (owner ruling 2026-10-04, ENV-0104), and Ct of the total-speed Reynolds number Re = |v| D / ν (ReynoldsNumber(speed, D, ν) for either). The former Re = |v|² D / (ν |v_n|) grew without bound as the flow turned into the axis: a 0.02 m rope at 1.5 m/s passed 10⁶ about 1.7° off its axis, so Cd fell from 1.14 to the drag crisis value 0.3 or took the lift term below. On Re_n the same rope 1° off its axis has Re_n = 521 and Cd = 1.01; Cd stays finite as the flow turns into the axis (Re_n is floored at 10⁻⁶, so its limit at Re_n = 0 is 1 + 10⁵) and the normal drag Cd |v_n| v_n falls to zero. The cable models follow the independence (cross-flow) principle (owner ruling 2026-10-04): the normal drag Cd |v_n| v_n across the axis and the axial skin friction Ct q|q| along it, q = v·axis. The form Cd |v_n| v (normal coefficient on the full velocity) was withdrawn: it gives an axial coefficient Cd sinφ cosφ (about 0.3 at 17° between flow and axis), far above measured skin friction.

Coefficient Fit Source
Cd, Re_n < 10⁻⁶ 1 + 10⁵, White's correlation at the floor kMinimumReynolds = 10⁻⁶ (finite at Re_n = 0) MARE-0331
Cd, 10⁻⁶ ≤ Re_n < 20.58 1 + 10 Re^(−2/3) F. M. White, Viscous Fluid Flow, 3rd ed., 2006, eq. (3-225), for 1 ≤ Re ≤ 2·10⁵ (cited from memory, not checked against the book), extended below Re = 1 where it matches the digitised White/Wiley curve; owner delegation 2026-10-04 (MARE-0331, ENV-0106)
Cd, 20.58 ≤ Re_n < 2515 0.75 + 2.35 / (Re^0.38 − 1.67) origin unknown
Cd, 2515 ≤ Re_n < 10⁶ 1.15 − 5.05 / (Re^0.5 − 31.6) origin unknown
Cd, Re_n ≥ 10⁶ 0.3, the drag crisis value (NormalDragCoefficient)
Ct 0.015 + 0.7535 / (Re^0.9 + 0.1) in every range, Re = |v| D / ν owner ruling R68; K. G. Aarsæther 2022; the Reynolds number of the fit is not recorded (ENV-0104)
C_a 1.0, normal to the axis only DNV-RP-C205 (2021) App. A, Table A-1

The lift term of fhsim_base CCable and fhsim_marine_elements RMCable (Cd = 0.068 / (|v_n|/|v|) above Re = 10⁶ within about 5° of the axis, source not recorded) was removed with the old Reynolds number: on Re_n it needs |v_n| ≥ 10⁶ ν / D together with |v_n| < 0.087 |v|, that is |v| ≥ 11.5 m/s · (1 m / D), which no cable reaches (ENV-0104). Why Ct is on |v|: the fit's own Reynolds number is not recorded (the original evaluated it on the former Re); |v| D / ν is finite in axial flow and equals Re_n in normal flow, where the coefficients are unchanged.

Branch edges of Cd. The edge kLowReynolds = 20.582841580981793 is where White's correlation crosses the second branch (the root of their difference in 50-digit arithmetic, rounded to a double), so Cd is continuous there (2.3315); at the floor Re_n = 10⁻⁶ Cd is continuous (1 + 10⁵); at Re_n = 2515 the second and third branches differ by 0.38 % (0.8811 against 0.8778); at 10⁶ Cd drops to the drag crisis value. The fit that White's correlation replaced below Re = 14, 1.3 + 8.85 / (Re^0.85 + 0.01646) (origin unknown; offset by owner decision 2026-10-01, MARE-0322), stepped from 2.24 to 2.98 at Re = 14 and lay below the digitised cylinder-drag curve of White/Wiley, Incompressible Flow, from Re ≈ 5 (2.99 against about 3.8 at Re = 7, where White's correlation gives 3.73). Against the former fit Cd rises by up to 25 % between Re_n = 1 and 14 (most at Re ≈ 6.3) and falls by up to 8.5 % between 14 and 20.58 (most at 14). Below Re_n = 1 White's correlation is extended: it gives 30.2 at Re = 0.2 and 16.9 at 0.5, against 33.3 and 16.4 on the digitised curve and 33.9 and 16.8 from the former fit. It lies within 10 % of the former fit down to Re_n = 0.2, up to 21 % below it near Re_n = 0.05, and above it below Re_n = 0.006, where the former fit levelled off at 539. The floor kMinimumReynolds = 10⁻⁶ (1 + 10⁵) only keeps Cd finite at Re_n = 0, flow along the axis: the normal drag Cd |v_n| v_n ∝ |v_n|^(4/3) tends to 0 with or without it (at D = 0.02 m the floor is |v_n| = 5·10⁻¹¹ m/s). Only very thin, slow cables reach Re_n < 1 in cross flow.

NormalDragCoefficientDerivative, TangentialDragCoefficientDerivative and DragCoefficientDerivatives give dCd and dCt with respect to Re, and with respect to |v_n| (Cd only) and |v|² (Ct only), branch by branch: the slope of Cd jumps at the branch edges and the derivative is that of the branch taken; it is 0 below the floor Re_n = 10⁻⁶. The Jacobian of the drag force stays finite as |v_n| → 0: its normal-drag terms scale as Cd |v_n| ∝ |v_n|^(1/3) and tend to their axial-flow value, continuously but not Lipschitz.

Drag force of an element

DragForce(ρ, D, L, ν, v, a, formulation, F) gives the drag of an element of length L, v its velocity relative to the water and a its unit axis, with v_t = (v·a) a and v_n = v − v_t; DragForceJacobian gives ∂F/∂v and ∂F/∂a (a as a free vector at a unit a; a segment axis a = d/|d| chains it with (I − a aᵀ)/|d|). kWaterKinematicViscosity = 1.005e-6 m²/s is the viscosity the cable models take. Two formulations (owner decision 2026-10-04), DragFormulation:

Formulation Normal force per length Axial force per length
Independence (default; OrcaFlex "Standard") −½ρD Cd |v_n| v_n −½ρD Ct |v_t| v_t
Eames (bare cables) −½ρD (Cd |v_n| v_n + Ct (|v| − |v_n|) v_n) −½ρD Ct |v| v_t

Convention of Ct. TangentialDragCoefficient is on the projected area D L, not the skin area: the axial force per length is ½ρ D Ct |v_t| v_t, without π. Every model that takes it uses it so: fhsim_marine_elements CableSegmentWaterForce (ρ r L Ct |v_z| v_z), CableRMWaterLoad, fhsim_base CCable (¼ρDL per node). OrcaFlex's axial coefficient is on the skin area π d_a l, so its C_Dz = Ct / π; at Re = 3·10⁴, Ct = 0.0151 is a skin-friction coefficient of 0.0048. (RbCable's ElementWaterLoad puts π on its own constant, user-given Ct, the OrcaFlex convention; it does not take this law.)

Independence principle. Each component of the flow loads the cylinder on its own: the normal force goes as sin²φ, φ the angle between flow and axis, which is what measurements on yawed cylinders show, and the axial force is skin friction on the axial component. It is the usual form (DNV-RP-C205, Morison) and the one the cable models follow (owner ruling 2026-10-04).

Eames. M. C. Eames, "Steady-state theory of towing cables", Trans. RINA 110 (1968), as cited secondarily: in a bare cable at small φ the skin friction depends on the total speed, so the axial force is ½ρD Ct |v| v_t and a friction ½ρD Ct (|v| − |v_n|) v_n is added across the axis. Use it for bare towed or mooring cables in near-axial flow. The formulas were checked against the OrcaFlex manual (line theory, hydrodynamic and aerodynamic loads, https://www.orcina.com/webhelp/OrcaFlex/Content/html/Linetheory,Hydrodynamicandaerodynamicloads.htm); the original paper was not checked. Eames = independence + ½ρDL Ct (|v| v − |v_n| v_n − |v_t| v_t), which vanishes at φ = 0 and 90°.

Per metre of a 0.02 m rope at 1.5 m/s, ρ = 1025 kg/m³ (Ct = 0.0151 on Re = 2.99·10⁴); for comparison the withdrawn fhsim_base HydroCable/CablePendulum form ½ρD |w| (1.1 w_⊥ + 0.1 w_∥):

φ Cd Independence normal / axial [N/m] Eames normal / axial [N/m] ½ρD|w|(1.1 w_⊥ + 0.1 w_∥) [N/m]
0° 11 (Re_n = 0, clamped) 0 / 0.348 0 / 0.348 0 / 2.31
5° 0.890 0.156 / 0.345 0.184 / 0.346 2.21 / 2.30
17° 1.068 2.11 / 0.318 2.18 / 0.332 7.42 / 2.21
45° 1.106 12.75 / 0.174 12.82 / 0.246 17.94 / 1.63
80° 1.114 24.92 / 0.011 24.92 / 0.060 24.98 / 0.40
90° 1.114 25.70 / 0 25.70 / 0 25.37 / 0

Both are quadratic in v: 0 at v = 0, continuous as v_n → 0 (the terms of |v_n| tend to 0), and the Jacobian is 0 at v = 0. Validity: that of the coefficient fits above (smooth circular cylinder, steady flow, no vortex-induced vibration or strumming); neither formulation models the lift of a cable near the seabed (fhsim_base CCable adds its own).

The inertia term of Morison's equation, MorisonInertiaForce, is (1 + C_a) ρ V f a_n, with a_n the part of the particle acceleration normal to the element (owner rulings R67, R104): a slender line has no axial Froude-Krylov force on its lateral surface, and its axial added mass is left out.

15. Submergence

environment::body_submergence, BodySubmergence.h (owner ruling R66, ENV-0090, ENV-0101). The submergence s of a point is its depth below the local surface, s = z + η. The surface is taken as a plane over the body.

Body Wet fraction
Circle of radius h, centre at s F(u) = (acos(−u) + u √(1 − u²)) / π, u = s/h clamped to [−1, 1]
Cylinder element, ends at s_A, s_B, half-height h = r sin α (G(u_B) − G(u_A)) / (u_B − u_A), G = ∫F du; the length fraction when vertical
Sphere of radius r the spherical cap, h_s = clamp(s + r, 0, 2r), f = h_s² (3r − h_s) / (4r³)
Thin disc of diameter D, thickness T F of s over (D/2)√(1 − n_z²) + (T/2)|n_z|

CylinderWetFractionGradient adds the derivatives with respect to s_A, s_B and h, for a Jacobian (fhsim_base's CylinderFractionGradient, which takes the full section height 2h). The surface queries are gated by MaxWaveElevation(): a body deeper than the bound plus its half-size, or that high above the mean surface, has s = z without a query. SetSurface and SetWaveAcceleration hand an element the gated elevations at its ends and the mean particle acceleration. MediumDensity gives the body's water density below the surface and the environment's air density above it.