sar3d: GPU port of the notebook with four views

The sar3d processor is rewritten as a checked port of Multi_antenna_3D_clean_v1.ipynb:
NVRTC kernels, timing from the trace stamps, notebook parameter names and one cubic
SAR_VOXEL_M. It adds front, side, top and 3D views, drops gpr_cpp and the parity tools,
and the GUI speed now applies only while the socket speed is ignored.
This commit is contained in:
Ayzen
2026-10-02 16:05:22 +03:00
parent 61ef8720e1
commit 45861f4047
50 changed files with 1737 additions and 8144 deletions
@@ -8,6 +8,7 @@ from python_app.models.gui_profile_model import (
GuiPassThroughStateModel,
GuiProcessingStateModel,
GuiProfileModel,
GuiSar3dStateModel,
GuiStateModel,
)
@@ -53,6 +54,31 @@ class GuiProfileCodecTest(unittest.TestCase):
twice = GuiProfileModel.from_dict(once).to_dict()
self.assertEqual(once["gui"], twice["gui"])
def test_sar3d_section_round_trips(self) -> None:
sar3d = GuiSar3dStateModel(
input_positions="0,2",
output_positions="1,3",
min_depth_m=2.5,
max_depth_m=9.0,
start_freq_mhz=2000.0,
stop_freq_mhz=5500.0,
speed_m_s=1.42,
ignore_socket_speed_enabled=True,
look_angle_deg=6.5,
frame_radius=3,
voxel_m=0.035,
bp_ground_depth_m=1.1,
comp_range_power=0.5,
use_compensation=False,
normalize_each_frame=False,
)
profile = GuiProfileModel(gui=GuiStateModel(processing=GuiProcessingStateModel(sar3d=sar3d)))
decoded = GuiProfileModel.from_dict(profile.to_dict())
assert decoded.gui is not None
self.assertEqual(decoded.gui.processing.sar3d, sar3d)
def test_missing_gui_section_yields_none(self) -> None:
self.assertIsNone(GuiProfileModel.from_dict({}).gui)