|
FhSim
3.1.0
Marine systems simulation
|
| 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. |
examples/input/auv_ocean_fields.json, the Mackerel entry:
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.
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.
mackerel-only gain < measured gain < Calanus-only gain."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.
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.
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.