|
FhSim
3.1.0
Marine systems simulation
|
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.
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. |
Every velocity below is relative to the panel. Each coefficient set in the literature is defined on exactly one of them.
| 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.
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) |
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.
TwineCrossFlow.LocalThroughFlow) and 0.7 % (ScreenMF2022) to |F|. ScreenMF2022 then gives about 1 % more than MF2022 Eq. 10 at 45° when bar data are supplied.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).
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:
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.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.AtPanel is rejected: the law adds the panel's own induction itself (Accepts, PanelLoadLaw.h; ADR 0004).
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
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.
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:
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.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.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:
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).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.hasBarDirections == false), Evaluate returns a zero load with finite fields. The caller raises the setup error (lead ruling R11).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.
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:
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.
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).
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:
| 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:
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).
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.
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.
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)):
ScreenMF2022 gives 79 N against 102 N for N19a (−22.6 %, at Rn 1225, below the fit Rn).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).
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*).
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.TwineCrossFlow has the full in-plane twine load.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).
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 |
net_solidity::CylinderSolidity). With SolidityModel Fixed the given Sₙ is used. MF2022 fitted Eq. 11 in the image-measured Snm, 2–27 % above S_c for their nets (p. 041301-3); the owner chose S_c. The law's induction (Section 8) still takes the law's Sₙ.GetWakedCurrent and the net's WakeQuery (BodyWake::Query(): exclude the own lumped field, add the private field), plus the wave particle velocity averaged over their nodes (owner ruling R62), through NetFlowInteraction, so they see the other objects' lumped wakes, the net's internal wake and the waves, and never the net's own lumped source. Without CastWake the query is empty, and the current is the facade's waked current. With ExternalWakeUpdate Step (the default) the wake composition at each centroid and midpoint, the private field included, is taken once per integrator step in PreOdeFcn, after the net's own rebuild, and held for every RK stage and Jacobian evaluation of the step (owner decision R46, owner ruling R135); during a rebuild blend the held samples take the blend weight of each evaluation's time, so the right-hand side stays C1 in time through the blend (owner ruling R136).WakeLength).** The private grid covers the structure and reaches WakeLength beyond the rear panel; WakeLength 0 is the largest panel diameter (fhsim_environment WakeCaster.cpp, PrivateGrid). Before phase F WakeLength was the reach of the registered grid other objects sampled, 0 meaning five times the structure's size; it no longer changes what other objects see.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).After each marching build, at the same time and with the same blend, the net publishes one lumped source (marenv MakeLumpedSource):
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).Rho, q²_amb the area-weighted mean over the panels of |U_amb − u_p|², U_amb the current without any wake (lead ruling R87, superseding the shaded mean square of R55), so the momentum the lumped wake carries is the drag the net feels; with Periodic and WakeRelaxation α < 1, M ← αM + (1 − α)M_prev (marenv RelaxLumpedSource).MomentumFluxSum, owner ruling R95, which replaced R88's capped linear sum), and the facade composes the registered fields the same way. The private field keeps the product rule d = 1 − Π(1 − d_i) and multiplies onto the others' composition: its per-panel M is normalised by each panel's own shaded inflow, so adding linearly would count the shading twice (marenv doc/wake.md §4).The rebuild log line ends with "lumped source M = …, area …, rear centre (…) m".
M against the old panel sum (QF14, open). The lumped M is the drag the net actually feels over the ambient ½ρq²_amb (R87; over the shaded ½ρ|U_ref|² until R55 and R87). Before phase F other objects saw the per-panel sources, and each panel's M is its drag over its own shaded inflow's ½ρ|U|² (KF2012Common.h:369), so a shaded rear panel kept about its unshaded M. For the 960-panel cage of the benchmark the lumped M is 11.75 m² against 12.99 m² for the panel sum (0.905 of it), and a second cage 20 m behind is shaded 3.7 % less: cage-2/cage-1 drag 0.760 against 0.733 with the old direct panel sum (Net hydrodynamics: benchmark of load laws and wake evaluation § 11.3). The design's definition is kept, so the far wake carries exactly the felt drag; whether it should carry the panel sum instead is owner question QF14. In S3 (Lader cages) the panel drag of the lumped source, M·½ρU_ref², is within 1 % of the model's total drag at 0.5–0.93 m/s (MARE-0129).
With CastWake, Net/Disk and Net/Sphere cast one lumped source each through fhsim_environment's 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 |
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.Force input port in PreOdeFcn and takes its direction as the axis n (z when the force is zero), as OdeFcn does.OdeFcn and OdeJacobian with GetWakedFlow and WakeQuery{exclude = own field}, so a body never samples its own wake; without CastWake the query is empty and the result is bit for bit that of GetParticleVelocity. Their wake starts at the rear face, downstream of the centre where they read the flow.CurrentLoad computes the force with the body's own state velocity, while U_ref and the field's source velocity use the source velocity filtered over WakeFilterTime (default 5 s). For a fixed, moored or steadily moving body the two agree; during an acceleration M = F·ê_U/(½ρ|U_ref|²) is slightly inconsistent. A net has no such difference: its build evaluates every panel at the mean of its filtered node velocities, which also give u_s and U_ref (fhsim_environment WakeCaster.h).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").