FhSim  3.1.0
Marine systems simulation
Loading...
Searching...
No Matches
Net hydrodynamics: methods manual

This page states the theory behind the net panel load laws in src/hydrodynamics/: which velocity each law works on, every equation with its source, and what each law does outside its range. It describes the laws as the headers implement them. Where the code departs from a paper, the page says so. Why the pieces sit where they do is recorded in doc/adr/, and the vocabulary is fixed in CONTEXT.md.

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 (ADR 0001), 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 (ADR 0004). Which wakes reach a panel, and what a net or body casts for others, is Section 14.

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 (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; 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 (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 (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; 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 φ) (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 (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 (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 (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: fhsim_marine_elements_issue_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 0131 — Default law: replace the two-harmonic angle form with three harmonics, refitted to MF2022, Rudi, Løland and Zhan). 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 (0110 — Default load law misses lift at high solidity and the angle dependence of Rudi, Løland and Zhan (A6 disabled tests)):

  • 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: Validation: MF2022 towed panels (L1-L4), Validation: Rudi 1988 and Løland 1991 (L5, L6), Validation: Zhan 2006 planar nets and cylinder (L8, S2, W9, S6) and Validation: a3/b4 consistency and refit (L9).

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 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 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, Section 14.1). The lumped source carries the felt drag, 3.7 % less shading of a second cage than the old panel sum (QF14, Section 14.2).
  • 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. The wake a net or a body casts

The load laws above 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).

14.1 Two fields per casting net

With CastWake, Net/NetStructure and Net/NetStructureWithConstraints keep two fields (src/net/NetFlowInteraction.h: fhsim_environment's BodyWake and WakeCaster over the panel adapter of src/net/NetWakeCaster.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
  • Self-shading. The marching build evaluates each panel's law at the ambient current, the other objects' lumped wakes (never the net's own) and the private field of the panels upstream, without waves, and adds that panel's source with M = drag/(½ρ|U|²) at its own inflow and a solidity for its near wake. Panel sources have marenv's MF2022 Eq. 11 near wake (r = 1.08 − 0.97 S up to 0.579 D behind the panel, blended to the far wake). The solidity S is the panel's geometric (cylinder) solidity S_c at its current mesh opening, without the knot factor and less the overlap of the bar families: with x = t/(L₀ sin 2φ), S_c = 2x − x², which at φ = 45° is MF2022 Eq. 2, 2t/s − (t/s)² (owner ruling R56 with the lead's definition, MARE-0308; 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ₙ.
  • Own flow query. Panels (OdeFcn and Jacobian) and cable elements (OdeFcn, Jacobian and strain energy) read the waked current with 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).
  • Private grid reach (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.
  • **Objects inside the net (QF8, accepted). A separate SimObject inside a net's volume, such as a sinker tube, an internal rope or the lee side of a floater collar, sees only lumped sources, whose wake starts at the net's rear face, so it no longer sees the net's internal wake.
  • The lumped wake is a step at the rear face (QF7, accepted). The lumped wake starts at x_start = 0: the deficit is zero upstream of the rear-face plane and the full lumped deficit on it (about 0.29 at C_T 0.5). A separate SimObject that crosses the plane, such as a sinker tube, a bottom ring or a bridle node, sees a jump in its inflow, a state-dependent discontinuity in its OdeFcn. With an implicit integrator such as BDF this can show up as step-size collapse or Newton failures near the rear face (MARE-0152).
  • What you see. VisualFlowPlane 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: a NetWakeCaster 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).

14.2 The lumped source of a net

After each marching build, at the same time and with the same blend, the net publishes one lumped source (marenv MakeLumpedSource):

  • Force. F = Σ of the panel forces of that build, i.e. at the shaded inflows, so the self-shading of the rear panels is included (design § 1.1). Lift is dropped: only F·ê_U counts. The cable elements are not included (QF9); their share of the along-flow drag is 0 in every shipped wake fixture and validation net, which have no cable elements (MARE-0129). A net that has cable elements reports their share in each rebuild's log line (MARE-0141): "Cable drag along the mean relative flow X N, panel drag Y N: cables and floats are Z % of the net's drag". X is the cables' force (floats and sinkers on them included) at the flow they see minus their force when the water follows each element, so tension, weight and wave excitation drop out. It is a diagnostic only; M is unchanged. Nor is the added drag of NetStructure::SetAddedDragPerMPS (reachable only through that setter, since the input option is overwritten by the net definition file): the wake-casting panel evaluation does not include it, so M omits it in the same way (MARE-0164).
  • Relative flow. U_ref is the area-weighted mean over the panels of the free stream (ambient current with the other objects' lumped wakes, no waves) minus the panel velocity, the frame axis of the private field; ê_U = U_ref/|U_ref|. No source below 1 mm/s.
  • Momentum deficit. M = max(0, F·ê_U)/(½ρ q²_amb), ρ the net's 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).
  • Superposition (R95). The lumped field composes its source's and its images' deficits by the momentum-flux rule D(1 − D) = Σ d_i(1 − d_i) (marenv 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).
  • Frontal extent (QF5). The node positions of all panels are projected on the frame's two cross axes; the frontal area is the bounding rectangle W·H. If M/(W·H) > 0.96 the area is widened to M/0.96 so that M is kept, with a log line (QF6).
  • Position (QF7). The centre of that rectangle on the rear face, the plane of the downstream-most node; the field is published with x_start = 0, so the wake starts there.
  • Near wake (QF4). Solidity 0: the lumped source keeps the pinned momentum-theory near wake. Eq. 11 with a mean Sₙ would fit a single screen but not the two walls of a cage.

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).

14.3 Bodies: Net/Disk and Net/Sphere

With CastWake, Net/Disk and Net/Sphere cast one lumped source each through fhsim_environment's WakeCastingObject and LumpedWakeCaster (MARE-0127, QF10), 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 (disk_drag::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²/4·|n·ê_U| + D·T·√(1 − (n·ê_U)²) (face ellipse plus edge rectangle; D = DiskD, T = DiskT) πD²/4
Rear-face centre, downstream of the centre (T/2)|n·ê_U| + (D/2)√(1 − (n·ê_U)²) D/2
  • The frontal area has no cable-diameter correction, while the drag areas do: the disk's normal and edge drag use D(D − d/π)π/4 and (D − d)·T with the cable diameter d (DiskBase.h:18,23), the sphere's drag uses D(D − d/π)π/4 (Sphere.cpp, K above). The frontal area is the full silhouette, πD²/4 and D·T. With the default cable diameter 0.01 m on a 1 m disk the difference is at most 1 %; a thick cable through a small body widens its lumped wake relative to its drag area.
  • The disk axis. The disk reads its Force input port in PreOdeFcn and takes its direction as the axis n (z when the force is zero), as OdeFcn does.
  • Own flow. Both bodies read their water velocity in 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.
  • Velocity in the force (owner answer QF12: kept). 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 WakeCaster.h).
  • A face-on disk has M/A = C_n (D − d/π)/D ≈ 1.2 at the default C_n (test BodyWake.RegisteredSourceHasTheMomentumDeficitOfTheDrag: 1.196), 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").