FhSim  3.1.0
Marine systems simulation
Loading...
Searching...
No Matches
0042 — The AuvSurvey mackerel field fills the Calanus band, so the 38 kHz channel over the plankton layer is mackerel
ID 0042
Class KNOWN-LIMITATION
Severity 2
Status blocked
Models — (the scenario data in examples/input/auv_ocean_fields.json)
Found 2026-09-23
Decision needed Is an ambient mackerel concentration through the whole upper water column what the AuvSurvey scenario is meant to have? It is defensible oceanography and it is also what stops the scenario from demonstrating the frequency response of a plankton layer, which is what the three-frequency sounder is in the file for. Either the field is right and the scenario's documentation and tests are what must change (which is what has been done), or the mackerel background belongs only in the upper 20 m and the Mackerel entry of the JSON should be narrowed.

Evidence

examples/input/auv_ocean_fields.json, the Mackerel entry:

"background": {
"type": "depth_profile",
"depth": [0.0, 40.0, 45.0, 400.0],
"values": [2.0e-4, 2.0e-4, 0.0, 0.0]
},
"features": [
{ "type": "gaussian_blob",
"centre": [400.0, 200.0, 20.0],
"sigma": [150.0, 90.0, 8.0],
"heading_deg": 60.0, "amplitude": 6.0e-2 },
...
]

The background is a flat 2e-4 kg/m3 of mackerel from the surface to 40 m, and the first school reaches into the north-east corner of the survey box of examples/input/AuvSurvey.xml, whose waypoints are (300, 0), (300, 100) and (0, 100). The Calanus band of the same file is centred at 28 m, inside both.

A mackerel is a far better 38 kHz target than a copepod. With the target strengths the scenario configures, evaluated over the 26 m to 31 m bins the echogram case of tests/AuvSurvey_Test.cpp integrates, along the track the vehicle actually flies:

Calanus Mackerel Sum Echogram reads
38 kHz -85.7 dB -72.4 dB -72.2 dB -71.3 dB
120 kHz -65.8 dB -69.1 dB -64.1 dB -64.1 dB
200 kHz -57.0 dB -67.6 dB -56.6 dB -56.6 dB

The closed-form column and the file agree to within a decibel, so this is the field and not an artefact of the instrument. Reproduce with cd build/Release/playpen/bin && ./FhSim ../examples/input/fishery/AuvSurvey.xml and read AuvSurvey_echogram.csv.

Effect

The band the scenario calls "the Calanus layer" is mackerel at 38 kHz, a mixture at 120 kHz and Calanus at 200 kHz. Its rise from 38 kHz to 200 kHz is about 15 dB instead of the 28.75 dB a pure Rayleigh scatterer gives, so the scenario no longer demonstrates the clean 12 dB per octave contrast its own header comment is written around, and the 38 kHz gap between the cod layer and the plankton layer narrows from 31.5 dB to 14.2 dB.

Nothing is numerically wrong: the sounder sums the species it is given, and it is given a water column with fish in it. What is wrong is only the story the file tells about itself, and that story has been rewritten in examples/input/AuvSurvey.xml and in tests/AuvSurvey_Test.cpp to describe the mixture rather than the pure layer.

It is worth noticing that the effect is real oceanography and arguably the more interesting scenario: an ambient of large swim-bladdered fish masking a copepod layer at the low frequency is exactly the situation a multi-frequency survey exists to resolve.

Possible fix

  1. Leave the field alone and keep the documentation and the assertions as they now are. The scenario demonstrates a two-species band and says so, and its frequency assertion is the bracket mackerel-only gain < measured gain < Calanus-only gain.
  2. Confine the mackerel background to the upper 20 m, for example "depth": [0, 18, 24, 400], "values": [2e-4, 2e-4, 0, 0], and move the first school's centre north of 700 m. The Calanus band then contains Calanus alone again, the 12 dB-per-octave assertion becomes exact once more, and the field becomes a slightly tidier but less realistic ocean.

Option 2 changes physics, so it is not taken on sight. The same JSON is also fhsim_environment/examples/input/auv_ocean_fields.json, and the two copies would have to move together.

Test that would prove it

tests/AuvSurvey_Test.cpp, AuvSurvey_TheEchogramSeparatesTheSpeciesByFrequency, already measures the quantity: it computes the linear-mean Sv of the 26 m to 31 m band at each of the three frequencies. Under option 2 that case's EXPECT_GT(measuredGain, 8.0) bracket would become EXPECT_NEAR(28.75, measuredGain, 3.0) again, and cod38 - calanus38 would go back above 15 dB.

Risk

Option 1 has no risk; it is the state of the tree. Option 2 changes every Sv in the echogram above 24 m and both the SilCam and the echogram assertions, and it changes a file that fhsim_environment also ships and tests.