FhSim  3.1.0
Marine systems simulation
Loading...
Searching...
No Matches
0131 — Default law: replace the two-harmonic angle form with three harmonics, refitted to MF2022, Rudi, Løland and Zhan
ID 0131
Class KNOWN-LIMITATION
Severity 2
Status blocked

Models: hydrodynamics::LocalThroughFlow (default law), hydrodynamics::ScreenKF2012 (same angle form); both selectable by HydroModel on Net/NetStructure and Net/NetStructureWithConstraints

Found: 2026-09-27, WP-G4 (lead ruling R36 (d)), from MARE-0110 and the owner answer to OWNER_QUESTIONS Q11

Decision needed: Owner: the refit below (a5 and b6 added) improves the angle fits but cannot fix the 26–31 % lift deficit at 45° (see "Fit, 2026-09-30", point 2). Adopt the refit values as the new defaults (a change to every inclined-panel baseline, A12 approval), fit a solidity-dependent lift instead, or keep the two-harmonic form?

Evidence

The owner answered Q11 on 2026-09-27 with the lead's recommendation: disclose the misfit now, and replace the angle form later as a separate work package (R36 (d)). The misfit itself is MARE-0110 (0110 — Default load law misses lift at high solidity and the angle dependence of Rudi, Løland and Zhan (A6 disabled tests)), with the full numbers. In short: the two-harmonic KF2012 Eq. 14 form, C_D(θ) = cd[(1 − a3) cos θ + a3 cos 3θ] and C_L(θ) = cl[sin 2θ + b4 sin 4θ] (kf2012::DragAngleFactor, kf2012::LiftAngleFactorPerSinCos, src/hydrodynamics/KF2012Common.h), gives CL(45°) 26–31 % below MF2022 Eq. 10 for N33a, N36a, N33b (L1) and an angle dependence at 60–80° weaker than Rudi (L5), Løland (L6) and Zhan (L8). The L9 least-squares refit (a3 = 0.046, b4 = 0.050) leaves 16 of 66 L5/L8 checks failing, the same as the defaults, so the form has too few terms: no a3, b4 pair fits.

Effect

Inclined panels of every net under the default law get too little lift at high solidity and wrong drag and lift at 60–80°: the deformed shape of a cage and the steep panels of a trawl. Disclosed in the methods manual (Sections 9, 11.4, 13) and the validation report.

Possible fix

The work package (not started; nothing is tuned meanwhile, R20):

  1. Form. One more harmonic each from the KF2012 Eq. 12 Fourier series (p. 223): C_D(θ) = cd[(1 − a3 − a5) cos θ + a3 cos 3θ + a5 cos 5θ] and C_L(θ) = cl[b2 sin 2θ + b4 sin 4θ + b6 sin 6θ], with C_D(0) = cd and C_L(45°) = cl (Eq. 13) giving b2 − b6 = 1. Every term still carries cos θ, so C_D(90°) = C_L(90°) = 0 as now (the in-plane load is MARE-0111's term, not this one). Keep the AD-safe forms: the drag factor as a polynomial in cos θ, the lift as sin θ cos θ times a polynomial in cos θ (Inflow::liftBasis), no division by sin θ.
  2. Fit. Least squares, unweighted as in L9 (tests/PanelLoadLaw_Consistency_Test.cpp), over the A1 data in tests/data/: MF2022 Eq. 10 CD(45)/CD(0) and CL(45) for the eight Table 2 nets (mf2022_eq10_11.csv, mf2022_table2_nets.csv, mf2022_text_loads.csv), Rudi 1988 via KF2012 Fig. 5 (rudi1988_kf2012fig5_digitised.csv), Løland 1991 KF2012 Eq. 4 (loland1991_eq4.csv) and Zhan 2006 R30/R0, R60/R0 at K = 1 (zhan2006_planar_tables1-3.csv, zhan2006_nets.csv). Report the fitted a3, a5, b4, b6, their per-dataset values and the residuals; the new defaults are an owner decision.
  3. Solidity-dependent lift (as ScreenMF2022 does with Eq. 10) is the alternative if a constant third harmonic cannot fit N19a and N36a together; decide from the fit.
  4. Keep ScreenKF2012{a3, b4} backwards compatible (a5 = b6 = 0 reproduces today's loads) and add HydroA5, HydroB6 parameters only if the owner wants them user-settable (contract C3 addition, lead review).

Test that would prove it

Enabled and passing, untuned tolerances (R20):

  • The 11 A6 tests of MARE-0110: 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; PanelLoadLaw_Consistency.DISABLED_L9_DefaultHarmonicsSatisfyL5AndL8 (L9 rewritten for the new parameters: the defaults satisfy L5 and L8).
  • Their SimObject twins NetValidation_TowedPanel_VALIDATION.DISABLED_S1_L2_TextLiftAt1p75, DISABLED_S1_L8_AngleRatios, DISABLED_S1_L8_SpeedTrendAt30And60Deg.
  • Unchanged and still passing: L1 CD, L2 drag, L3, the L8 absolute R0, the L7 invariants and the AD Jacobian checks over sfh::ad::Dual<18>.

Scope caveat: three of the 11 are at or near normal incidence, where every normalised angle form gives C_D(0) = cd: DISABLED_L4_LocalCdPlateauAt0Deg (the Re trend of localCd at 0°), the C_D(0) part of DISABLED_L6_DragAtNormalIncidence_LocalThroughFlow, and DISABLED_L2_TextLiftAt1p75_ScreenMF2022 (ScreenMF2022, Eq. 10 itself). An angle form cannot make these pass; the work package reports them and the owner decides whether they stay disabled with this issue or move to their own.

Risk

Changes the load on every inclined panel under the default law, and so every regression baseline with an inclined net (A12, owner approval, Q16) and the validation pages (regenerate with tests/plot_validation.py). Adds law parameters (a contract C2 change, lead review first).

Fit, 2026-09-30

Owner decision 2026-09-30: run the least-squares fit and report; the defaults are not changed. The script is tools/fit_angle_harmonics.py (numpy only, reads tests/data/). Unweighted least squares on absolute ratio residuals, as L9; the datasets are the angle ratios alone (the magnitudes cd and cl are the law's, not the form's): Rudi 1988 via KF2012 Fig. 5 (24 drag and 16 lift points), Zhan 2006 R30/R0 and R60/R0 at K = 1 (24 points) and, as the Rudi fit of Løland, KF2012 Eq. 4 sampled at Sn 0.13, 0.18, 0.25 and 0.317 every 15 degrees (28 drag and 5 lift points). The Løland sampling is mine, not one of the repository's L6 tests.

form fitted RMS(model - data): Rudi / Zhan / Løland
drag, default a3 = 0.07 0.065 / 0.131 / 0.136
drag, a3 only a3 = 0.005 0.062 / 0.121 / 0.093
drag, a3 and a5 a3 = -0.009, a5 = 0.028 0.051 / 0.121 / 0.089
lift, default b4 = 0.10 0.119 (Rudi) / 0.078 (Løland)
lift, b4 only b4 = 0.036 0.115 / 0.028
lift, b4 and b6 (b2 = 1 + b6) b4 = 0.054, b6 = 0.063 0.085 / 0.081
  1. The third harmonic helps, but moderately. The mean drag-ratio residual at 55–85° falls from -0.088 to +0.007 on Rudi and from -0.080 to +0.039 on Zhan, and the Rudi lift RMS from 0.119 to 0.085. The Zhan drag ratios stay 0.12 off: one net family, scattered (the repository's own L8 note says a 0.25 m/s row has R30 > R0).
  2. No choice of a3, a5, b4, b6 fixes the 26–31 % lift deficit at 45° of L1 and L2. With C_L = cl (b2 sin 2θ + b4 sin 4θ + b6 sin 6θ) and C_L(45°) = cl (b2 - b6) = cl (KF2012 Eq. 13), the lift at 45° is cl whatever the harmonics are; cl is the Schubauer value from the drag (SchubauerLiftCoefficient). Closing it needs a different cl: the solidity-dependent lift of option 3 of the possible fix (as ScreenMF2022 uses MF2022 Eq. 10). The item's premise that "the form has too few terms" holds for the 60–80° angle dependence (L5, L6, L8) but not for L1 and L2.
  3. The fit is over ratio data only. Whether the refit values pass the 11 disabled A6 tests is not measured here; they would need the law changed and the tests run, which waits for the decision above.