fullwave25 1.4.1.dev2__tar.gz → 1.4.2.dev0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (399) hide show
  1. {fullwave25-1.4.1.dev2 → fullwave25-1.4.2.dev0}/.bumpversion.toml +1 -1
  2. fullwave25-1.4.2.dev0/.claude/.gitignore +1 -0
  3. fullwave25-1.4.2.dev0/.claude/20260911_1813_dead-code.md +162 -0
  4. fullwave25-1.4.2.dev0/.claude/20260916_1311_commit_message_of_the_input_generation_speedup.md +13 -0
  5. fullwave25-1.4.2.dev0/.claude/20260916_1311_pull_request_of_the_input_generation_speedup.md +31 -0
  6. fullwave25-1.4.2.dev0/.claude/20260916_1405_commit_message_of_the_relaxation_memory_estimate.md +10 -0
  7. fullwave25-1.4.2.dev0/.claude/20260916_1405_pull_request_of_the_relaxation_memory_estimate.md +24 -0
  8. fullwave25-1.4.2.dev0/.claude/20260916_2152_commit_message_of_the_cuda_version_choice.md +10 -0
  9. fullwave25-1.4.2.dev0/.claude/20260916_2152_pull_request_of_the_cuda_version_choice.md +25 -0
  10. fullwave25-1.4.2.dev0/.claude/20260916_2203_commit_message_of_the_cuda_version_tests.md +10 -0
  11. fullwave25-1.4.2.dev0/.claude/20260916_2213_commit_message_of_the_blackwell_version_choice.md +9 -0
  12. fullwave25-1.4.2.dev0/.claude/20260916_2213_pull_request_of_the_blackwell_version_choice.md +23 -0
  13. fullwave25-1.4.2.dev0/.claude/CLAUDE.md +286 -0
  14. fullwave25-1.4.2.dev0/.claude/matrix_imaging/20260909_1844_acquire_the_reflection_matrix.py +55 -0
  15. fullwave25-1.4.2.dev0/.claude/matrix_imaging/20260909_1900_test_on_a_synthetic_acquisition.py +139 -0
  16. fullwave25-1.4.2.dev0/.claude/matrix_imaging/20260909_1913_analyze_the_reflection_matrix.py +111 -0
  17. fullwave25-1.4.2.dev0/.claude/matrix_imaging/20260909_2107_redraw_the_figures_of_an_analysis.py +48 -0
  18. fullwave25-1.4.2.dev0/.claude/matrix_imaging/20260909_2121_write_the_result_tables.py +177 -0
  19. fullwave25-1.4.2.dev0/.claude/matrix_imaging/20260910_1126_synthesize_plane_waves_from_the_multistatic_matrix.py +132 -0
  20. fullwave25-1.4.2.dev0/.claude/matrix_imaging/20260910_1137_scan_the_speed_of_sound.py +531 -0
  21. fullwave25-1.4.2.dev0/.claude/matrix_imaging/20260910_1141_compare_the_laws_with_the_truth.py +490 -0
  22. fullwave25-1.4.2.dev0/.claude/matrix_imaging/20260910_1146_evaluate_the_reverberation_filter.py +525 -0
  23. fullwave25-1.4.2.dev0/.claude/matrix_imaging/20260910_1208_compare_plane_waves_with_the_synthesis.py +143 -0
  24. fullwave25-1.4.2.dev0/.claude/matrix_imaging/figures.py +521 -0
  25. fullwave25-1.4.2.dev0/.claude/matrix_imaging/ground_truth.py +394 -0
  26. fullwave25-1.4.2.dev0/.claude/matrix_imaging/matrix_imaging.py +1346 -0
  27. fullwave25-1.4.2.dev0/.claude/matrix_imaging/pipeline.py +534 -0
  28. fullwave25-1.4.2.dev0/.claude/matrix_imaging/reflection_matrix.py +370 -0
  29. fullwave25-1.4.2.dev0/.claude/matrix_imaging/speed_of_sound.py +417 -0
  30. fullwave25-1.4.2.dev0/.claude/matrix_imaging/synthetic.py +166 -0
  31. fullwave25-1.4.2.dev0/.claude/scratch/20260821_0206_band_anchor_cross_check.py +137 -0
  32. fullwave25-1.4.2.dev0/.claude/scratch/20260821_0233_delivered_power_law_end_to_end.py +125 -0
  33. fullwave25-1.4.2.dev0/.claude/scratch/20260821_0317_reword_deliver_in_the_library.py +59 -0
  34. fullwave25-1.4.2.dev0/.claude/scratch/20260821_1220_relaxation_low_frequency_rolloff.py +246 -0
  35. fullwave25-1.4.2.dev0/.claude/scratch/20260825_1937_what_fails_the_pml_golden_tests.py +103 -0
  36. fullwave25-1.4.2.dev0/.claude/scratch/20260825_2329_does_the_wrapper_read_the_record.py +112 -0
  37. fullwave25-1.4.2.dev0/.claude/scratch/20260826_0002_what_the_new_default_table_holds.py +92 -0
  38. fullwave25-1.4.2.dev0/.claude/scratch/20260828_1422_what_the_candidate_tables_hold.py +101 -0
  39. fullwave25-1.4.2.dev0/.claude/scratch/20260828_1427_what_the_deployment_needs.py +249 -0
  40. fullwave25-1.4.2.dev0/.claude/scratch/20260828_1510_where_the_unstretched_ramp_reaches.py +218 -0
  41. fullwave25-1.4.2.dev0/.claude/scratch/20260828_1517_the_blast_radius_of_the_ramp.py +237 -0
  42. fullwave25-1.4.2.dev0/.claude/scratch/20260830_1458_the_3d_region_trimmed_kernel_against_the_reference.py +196 -0
  43. fullwave25-1.4.2.dev0/.claude/scratch/20260830_1505_the_multi_node_kernel_against_the_multi_gpu_one.py +179 -0
  44. fullwave25-1.4.2.dev0/.claude/scratch/20260830_1631_the_3d_multi_node_against_the_multi_gpu_one.py +119 -0
  45. fullwave25-1.4.2.dev0/.claude/scratch/20260830_1642_the_selective_absorbing_layer.py +176 -0
  46. fullwave25-1.4.2.dev0/.claude/scratch/20260830_1728_the_layer_against_the_taper.py +312 -0
  47. fullwave25-1.4.2.dev0/.claude/scratch/20260830_1757_what_the_margin_outside_the_layer_does.py +286 -0
  48. fullwave25-1.4.2.dev0/.claude/scratch/20260830_1808_the_layer_in_3d_and_on_the_multi_node_builds.py +446 -0
  49. fullwave25-1.4.2.dev0/.claude/scratch/20260830_1832_where_the_3d_residual_sits.py +324 -0
  50. fullwave25-1.4.2.dev0/.claude/scratch/20260830_1837_inside_the_layer_at_the_corner.py +294 -0
  51. fullwave25-1.4.2.dev0/.claude/scratch/20260830_1840_inside_the_3d_layer_at_the_corner.py +292 -0
  52. fullwave25-1.4.2.dev0/.claude/scratch/20260830_1912_both_absorbers_on_one_method.py +326 -0
  53. fullwave25-1.4.2.dev0/.claude/scratch/20260830_1922_the_layer_on_the_reflection_method.py +443 -0
  54. fullwave25-1.4.2.dev0/.claude/scratch/20260830_2011_whole_domain_animation.py +327 -0
  55. fullwave25-1.4.2.dev0/.claude/scratch/20260830_2032_the_example_source_kind.py +168 -0
  56. fullwave25-1.4.2.dev0/.claude/scratch/20260830_2148_drive_scale_of_the_strong_beta_cells.py +71 -0
  57. fullwave25-1.4.2.dev0/.claude/scratch/20260830_2159_profile_the_input_map_build.py +250 -0
  58. fullwave25-1.4.2.dev0/.claude/scratch/20260830_2201_build_then_extend_equivalence.py +201 -0
  59. fullwave25-1.4.2.dev0/.claude/scratch/20260830_2304_the_transmit_methods_launch_what_they_say.py +208 -0
  60. fullwave25-1.4.2.dev0/.claude/scratch/20260830_2322_the_unscaled_added_drive_follows_the_courant_number.py +239 -0
  61. fullwave25-1.4.2.dev0/.claude/scratch/20260831_0033_the_three_dimensional_arrays.py +249 -0
  62. fullwave25-1.4.2.dev0/.claude/scratch/20260831_0054_the_elevation_lens_of_a_linear_array.py +276 -0
  63. fullwave25-1.4.2.dev0/.claude/scratch/20260831_0115_run_every_example.sh +21 -0
  64. fullwave25-1.4.2.dev0/.claude/scratch/20260831_0124_move_the_notebooks_to_the_transmit_interface.py +274 -0
  65. fullwave25-1.4.2.dev0/.claude/scratch/20260831_0137_the_air_region_at_four_mechanisms.py +314 -0
  66. fullwave25-1.4.2.dev0/.claude/scratch/20260831_0148_the_element_records_its_own_transmit.py +202 -0
  67. fullwave25-1.4.2.dev0/.claude/scratch/20260831_0150_the_absorbing_layer_of_a_point_source.py +235 -0
  68. fullwave25-1.4.2.dev0/.claude/scratch/20260831_0152_the_exponential_absorbing_layer_against_its_thickness.py +213 -0
  69. fullwave25-1.4.2.dev0/.claude/scratch/20260831_0202_the_rebuilt_exponential_absorbing_layer.py +267 -0
  70. fullwave25-1.4.2.dev0/.claude/scratch/20260831_0216_where_the_three_dimensional_layer_leaks.py +258 -0
  71. fullwave25-1.4.2.dev0/.claude/scratch/20260831_0222_the_absorbing_layer_away_from_the_source.py +266 -0
  72. fullwave25-1.4.2.dev0/.claude/scratch/20260831_1037_where_the_near_field_brightness_comes_from.py +276 -0
  73. fullwave25-1.4.2.dev0/.claude/scratch/20260831_1040_the_aperture_transit_wedge_in_the_channel_data.py +296 -0
  74. fullwave25-1.4.2.dev0/.claude/scratch/20260831_1043_the_transmit_in_the_recorded_trace_and_its_removal.py +460 -0
  75. fullwave25-1.4.2.dev0/.claude/scratch/20260831_1048_the_receive_row_against_the_reference_subtraction.py +491 -0
  76. fullwave25-1.4.2.dev0/.claude/scratch/20260831_1052_the_backing_behind_the_array_face.py +495 -0
  77. fullwave25-1.4.2.dev0/.claude/scratch/20260831_1056_the_transmit_beam_with_the_air_backing.py +233 -0
  78. fullwave25-1.4.2.dev0/.claude/scratch/20260831_1105_the_shipped_transducer_stack_in_the_solver.py +485 -0
  79. fullwave25-1.4.2.dev0/.claude/scratch/20260831_1119_where_the_stack_puts_the_source_and_what_it_costs_the_depth.py +446 -0
  80. fullwave25-1.4.2.dev0/.claude/scratch/20260831_1121_the_depth_the_image_reads_with_the_stack.py +451 -0
  81. fullwave25-1.4.2.dev0/.claude/scratch/20260831_1123_the_depth_the_beamformer_puts_one_point_at.py +353 -0
  82. fullwave25-1.4.2.dev0/.claude/scratch/20260831_1142_the_transmit_offset_the_beamformer_needs.py +367 -0
  83. fullwave25-1.4.2.dev0/.claude/scratch/20260831_1145_the_depth_shift_the_offset_fix_makes.py +183 -0
  84. fullwave25-1.4.2.dev0/.claude/scratch/20260831_1154_the_two_offset_rules_on_the_same_recording.py +231 -0
  85. fullwave25-1.4.2.dev0/.claude/scratch/20260831_1212_what_the_pinned_release_carries.py +141 -0
  86. fullwave25-1.4.2.dev0/.claude/scratch/20260831_1228_the_low_cut_against_the_near_field_haze.py +490 -0
  87. fullwave25-1.4.2.dev0/.claude/scratch/20260831_1301_run_the_beamforming_notebooks.py +50 -0
  88. fullwave25-1.4.2.dev0/.claude/scratch/20260831_1432_point_dataset_generator_at_the_local_fullwave.py +92 -0
  89. fullwave25-1.4.2.dev0/.claude/scratch/20260831_1437_the_aperture_width_the_reference_geometry_reports.py +79 -0
  90. fullwave25-1.4.2.dev0/.claude/scratch/20260831_1454_calibrate_the_ats539_plane_wave.py +367 -0
  91. fullwave25-1.4.2.dev0/.claude/scratch/20260831_1508_show_the_b_mode_in_the_hdf5.py +315 -0
  92. fullwave25-1.4.2.dev0/.claude/scratch/20260831_1534_the_comet_behind_each_wire.py +241 -0
  93. fullwave25-1.4.2.dev0/.claude/scratch/20260831_1547_read_the_calibration_trials.py +226 -0
  94. fullwave25-1.4.2.dev0/.claude/scratch/20260831_1605_what_the_medium_holds_in_the_near_field.py +195 -0
  95. fullwave25-1.4.2.dev0/.claude/scratch/20260831_1607_sweep_one_generator_knob.py +322 -0
  96. fullwave25-1.4.2.dev0/.claude/scratch/20260831_1715_assert_the_ats539_rate_chain.py +166 -0
  97. fullwave25-1.4.2.dev0/.claude/scratch/20260831_1717_measure_every_layer_of_the_stack.py +151 -0
  98. fullwave25-1.4.2.dev0/.claude/scratch/20260831_1720_where_the_trailing_energy_lands.py +201 -0
  99. fullwave25-1.4.2.dev0/.claude/scratch/20260831_1725_offer_the_requested_absorption_to_the_backing.py +119 -0
  100. fullwave25-1.4.2.dev0/.claude/scratch/20260831_1727_let_a_sweep_carry_a_switch.py +105 -0
  101. fullwave25-1.4.2.dev0/.claude/scratch/20260831_1731_expose_the_exponential_absorbing_layer.py +121 -0
  102. fullwave25-1.4.2.dev0/.claude/scratch/20260831_1746_point_the_solver_at_an_older_binary.py +95 -0
  103. fullwave25-1.4.2.dev0/.claude/scratch/20260831_1756_measure_the_point_targets.py +154 -0
  104. fullwave25-1.4.2.dev0/.claude/scratch/20260831_1802_rederive_the_near_field_bounce.py +106 -0
  105. fullwave25-1.4.2.dev0/.claude/scratch/20260831_1810_does_the_shelf_move_with_depth.py +199 -0
  106. fullwave25-1.4.2.dev0/.claude/scratch/20260831_1812_find_the_repeat_delay_in_the_raw_rf.py +168 -0
  107. fullwave25-1.4.2.dev0/.claude/scratch/20260831_1937_give_each_source_row_its_own_launch_delay.py +88 -0
  108. fullwave25-1.4.2.dev0/.claude/scratch/20260831_1943_baffle_the_element_plane.py +103 -0
  109. fullwave25-1.4.2.dev0/.claude/scratch/20260831_1952_take_the_cell_size_from_the_grid.py +70 -0
  110. fullwave25-1.4.2.dev0/.claude/scratch/20260831_2058_run_the_ats539_through_the_batched_solver.py +120 -0
  111. fullwave25-1.4.2.dev0/.claude/scratch/20260831_2105_queue_the_remaining_candidates.py +143 -0
  112. fullwave25-1.4.2.dev0/.claude/scratch/20260831_2122_the_simulator_asks_for_a_clamped_source.py +111 -0
  113. fullwave25-1.4.2.dev0/.claude/scratch/20260831_2126_rename_the_source_types_to_hard_and_soft.py +98 -0
  114. fullwave25-1.4.2.dev0/.claude/scratch/20260831_2140_bind_the_source_type_to_its_entrance.py +224 -0
  115. fullwave25-1.4.2.dev0/.claude/scratch/20260831_2225_how_redundant_are_the_absorbing_layer_files.py +166 -0
  116. fullwave25-1.4.2.dev0/.claude/scratch/20260831_2239_skip_the_constant_absorbing_layer_maps.py +171 -0
  117. fullwave25-1.4.2.dev0/.claude/scratch/20260831_2246_count_the_files_a_run_writes.py +144 -0
  118. fullwave25-1.4.2.dev0/.claude/scratch/20260831_2352_run_the_map_tiers_end_to_end.py +243 -0
  119. fullwave25-1.4.2.dev0/.claude/scratch/20260831_2355_draw_the_absorbing_layer_map_cost.py +170 -0
  120. fullwave25-1.4.2.dev0/.claude/scratch/20260901_1502_can_the_transmit_reach_the_harmonic_band.py +173 -0
  121. fullwave25-1.4.2.dev0/.claude/scratch/20260901_1504_contrast_harmonic_imaging.py +896 -0
  122. fullwave25-1.4.2.dev0/.claude/scratch/20260901_1507_where_each_band_puts_its_largest_sample.py +139 -0
  123. fullwave25-1.4.2.dev0/.claude/scratch/20260901_1519_is_the_harmonic_tail_cumulative.py +280 -0
  124. fullwave25-1.4.2.dev0/.claude/scratch/20260901_1537_does_the_cancellation_work.py +202 -0
  125. fullwave25-1.4.2.dev0/.claude/scratch/20260901_1612_does_a_sparse_bubble_cloud_localize.py +232 -0
  126. fullwave25-1.4.2.dev0/.claude/scratch/20260901_1619_calibrate_the_bubble_scatter_range.py +310 -0
  127. fullwave25-1.4.2.dev0/.claude/scratch/20260901_1622_draw_the_sweep_b_modes.py +168 -0
  128. fullwave25-1.4.2.dev0/.claude/scratch/20260901_1654_where_the_bright_region_sits.py +367 -0
  129. fullwave25-1.4.2.dev0/.claude/scratch/20260901_1701_where_one_bubble_images.py +301 -0
  130. fullwave25-1.4.2.dev0/.claude/scratch/20260901_1702_does_the_portable_example_reproduce_the_evaluation.py +115 -0
  131. fullwave25-1.4.2.dev0/.claude/scratch/20260901_1753_does_the_ported_solver_still_march_the_same.py +212 -0
  132. fullwave25-1.4.2.dev0/.claude/scratch/20260901_1755_do_the_ranks_agree_on_the_bubbles.py +385 -0
  133. fullwave25-1.4.2.dev0/.claude/scratch/20260901_1817_does_the_air_region_reach_every_solver.py +331 -0
  134. fullwave25-1.4.2.dev0/.claude/scratch/20260901_1818_does_the_air_region_reach_every_rank.py +285 -0
  135. fullwave25-1.4.2.dev0/.claude/scratch/20260902_1317_what_the_abdomen_volume_holds.py +129 -0
  136. fullwave25-1.4.2.dev0/.claude/scratch/20260902_1319_art_wave_in_the_abdomen.py +584 -0
  137. fullwave25-1.4.2.dev0/.claude/scratch/20260902_1324_art_figures_from_the_field.py +2176 -0
  138. fullwave25-1.4.2.dev0/.claude/scratch/20260902_1744_art_final_animations.py +266 -0
  139. fullwave25-1.4.2.dev0/.claude/scratch/20260904_1216_art_wire_visibility.py +426 -0
  140. fullwave25-1.4.2.dev0/.claude/scratch/20260904_2327_b_mode_of_the_abdomen.py +1494 -0
  141. fullwave25-1.4.2.dev0/.claude/scratch/20260905_0038_two_against_three_dimensions.py +529 -0
  142. fullwave25-1.4.2.dev0/.claude/scratch/20260909_1934_probe_the_reverberation_filter_on_speckle.py +93 -0
  143. fullwave25-1.4.2.dev0/.claude/scratch/20260909_1939_probe_the_ideal_profile_on_speckle.py +86 -0
  144. fullwave25-1.4.2.dev0/.claude/scratch/20260909_2044_probe_the_correction_bases_on_a_flat_speckle.py +59 -0
  145. fullwave25-1.4.2.dev0/.claude/scratch/20260909_2342_measure_the_wall_delay_screen.py +85 -0
  146. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1134_find_the_first_non_finite_value_of_the_plane_wave_correction.py +98 -0
  147. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1234_print_the_summaries_of_analyses.py +100 -0
  148. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/a_maps_checks.py +75 -0
  149. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/b_effective_frequency.py +55 -0
  150. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/c_composed_steps.py +46 -0
  151. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/check_element_centers.py +77 -0
  152. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/check_plane_wave_law.py +248 -0
  153. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/d2_gate_quarter_period.py +52 -0
  154. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/d_gate_cases.py +52 -0
  155. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/e_plate_crash.py +63 -0
  156. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/f_patch_grid.py +17 -0
  157. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/g_frequency_scan.py +29 -0
  158. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/gouy_check.py +87 -0
  159. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/h_pulse_and_wires.py +23 -0
  160. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/i_phase_slope.py +28 -0
  161. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_2a8c46c5-7d0_a0200910_001.sh +1 -0
  162. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_2a8c46c5-7d0_a0200910_002.sh +6 -0
  163. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_2a8c46c5-7d0_a0200910_003.sh +5 -0
  164. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_2a8c46c5-7d0_a0200910_004.sh +10 -0
  165. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_2a8c46c5-7d0_a0200910_005.sh +8 -0
  166. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_2a8c46c5-7d0_a16f7afd_001.sh +6 -0
  167. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_2a8c46c5-7d0_a16f7afd_002.sh +13 -0
  168. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_2a8c46c5-7d0_a16f7afd_003.sh +12 -0
  169. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_2a8c46c5-7d0_a16f7afd_004.sh +9 -0
  170. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_2a8c46c5-7d0_a16f7afd_005.sh +13 -0
  171. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_2a8c46c5-7d0_a16f7afd_006.sh +13 -0
  172. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_2a8c46c5-7d0_a16f7afd_007.sh +16 -0
  173. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_2a8c46c5-7d0_a16f7afd_008.sh +10 -0
  174. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_2a8c46c5-7d0_a16f7afd_009.sh +34 -0
  175. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_2a8c46c5-7d0_a16f7afd_010.sh +39 -0
  176. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_2a8c46c5-7d0_a3e03828_001.sh +14 -0
  177. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_2a8c46c5-7d0_a3e03828_002.sh +10 -0
  178. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_2a8c46c5-7d0_a3e03828_003.sh +10 -0
  179. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_2a8c46c5-7d0_a3e03828_004.sh +8 -0
  180. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_2a8c46c5-7d0_a3e03828_005.sh +9 -0
  181. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_2a8c46c5-7d0_a86c0b02_001.sh +1 -0
  182. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_2a8c46c5-7d0_a86c0b02_002.sh +9 -0
  183. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_2a8c46c5-7d0_a86c0b02_003.sh +7 -0
  184. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_2a8c46c5-7d0_a86c0b02_004.sh +13 -0
  185. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_2a8c46c5-7d0_a86c0b02_005.sh +14 -0
  186. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_2a8c46c5-7d0_a86c0b02_006.sh +2 -0
  187. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_2a8c46c5-7d0_a86c0b02_007.sh +39 -0
  188. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_2a8c46c5-7d0_a86c0b02_008.sh +12 -0
  189. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_47c5d913-2f0_a86c7568_001.sh +10 -0
  190. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a09af998_001.sh +10 -0
  191. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a09af998_002.sh +20 -0
  192. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a09af998_003.sh +18 -0
  193. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a09af998_004.sh +24 -0
  194. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a09af998_005.sh +36 -0
  195. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a09af998_006.sh +18 -0
  196. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a09af998_007.sh +50 -0
  197. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a09af998_008.sh +32 -0
  198. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a09af998_009.sh +7 -0
  199. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a3c684a5_001.sh +1 -0
  200. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a3c684a5_002.sh +23 -0
  201. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a3c684a5_003.sh +6 -0
  202. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a3c684a5_004.sh +8 -0
  203. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a3c684a5_005.sh +1 -0
  204. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a3c684a5_006.sh +7 -0
  205. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a3c684a5_007.sh +12 -0
  206. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a99b1764_001.sh +1 -0
  207. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a99b1764_002.sh +9 -0
  208. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a99b1764_003.sh +17 -0
  209. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a99b1764_004.sh +16 -0
  210. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a99b1764_005.sh +6 -0
  211. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a99b1764_006.sh +13 -0
  212. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a99b1764_007.sh +8 -0
  213. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a99b1764_008.sh +13 -0
  214. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a99b1764_009.sh +11 -0
  215. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a99b1764_010.sh +19 -0
  216. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a99b1764_011.sh +16 -0
  217. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a99b1764_012.sh +19 -0
  218. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a99b1764_013.sh +17 -0
  219. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a99b1764_014.sh +7 -0
  220. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a99b1764_015.sh +6 -0
  221. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a99b1764_016.sh +20 -0
  222. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/instrumented_guard_run.py +108 -0
  223. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/instrumented_plane_wave_nan.py +71 -0
  224. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/j_wires_in_wall.py +27 -0
  225. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/origin_checks.py +76 -0
  226. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/origin_das.py +95 -0
  227. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/quick_checks.py +52 -0
  228. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/scan_checks.py +140 -0
  229. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/scan_checks_2.py +133 -0
  230. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/scan_checks_3.py +110 -0
  231. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/scan_checks_4.py +74 -0
  232. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/toy_plane_wave.py +161 -0
  233. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1241_check_that_the_records_load.py +58 -0
  234. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1241_locate_the_non_finite_values_of_an_analysis.py +43 -0
  235. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1241_measure_the_wire_depth_against_the_time_origin.py +61 -0
  236. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1241_print_the_time_origin_scans.py +48 -0
  237. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1241_test_the_entropy_the_antisymmetry_and_the_filter_linearity.py +88 -0
  238. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1247_time_the_phase_reversal_per_patch_against_batched.py +92 -0
  239. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1248_compare_the_synthesis_on_the_card_and_the_host.py +61 -0
  240. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1250_save_and_compare_the_local_laws_of_a_subset.py +113 -0
  241. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1254_analyze_the_2.5mhz_stage_2.sh +58 -0
  242. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1256_print_the_per_depth_curves_of_a_reverberation_test.py +48 -0
  243. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1302_print_the_durations_of_a_chain_log.py +43 -0
  244. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1314_print_the_gouy_points_of_a_speed_of_sound_scan.py +49 -0
  245. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1445_fit_the_moveout_speed_of_the_point_sources.py +307 -0
  246. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1456_fit_the_depth_offset_of_the_reference_arrivals.py +224 -0
  247. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1502_print_the_laws_and_gates_of_an_analysis.py +56 -0
  248. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1503_analyze_with_the_ramp_removal_off_or_every_law_one.py +144 -0
  249. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1504_measure_the_anti_diagonal_share_of_the_clean_clutter.py +203 -0
  250. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1508_estimate_the_speed_with_smaller_windows.py +138 -0
  251. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1553_focus_the_clutter_records_in_sub_bands.py +142 -0
  252. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1553_print_the_band_and_the_screens_of_the_records.py +87 -0
  253. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1554_predict_the_phase_speed_of_the_stencil.py +168 -0
  254. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1556_compute_the_moveout_truth_with_an_eikonal_solver.py +502 -0
  255. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1556_fit_the_height_offset_on_three_grids.py +252 -0
  256. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1600_measure_the_flat_and_the_screen_correction_on_point_targets.py +490 -0
  257. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1604_predict_the_arrivals_from_the_stencil.py +236 -0
  258. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1604_prototype_the_broadband_correction.py +508 -0
  259. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1605_scan_the_time_origin_with_other_element_planes.py +198 -0
  260. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1607_measure_the_local_far_field_structure_of_the_clutter.py +393 -0
  261. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1608_score_the_speed_scans_against_the_eikonal_truth.py +245 -0
  262. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1610_compare_the_unwrapped_law_delays_with_the_truth.py +186 -0
  263. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1611_compare_the_arrival_models_at_the_point_sources.py +364 -0
  264. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1613_compare_the_sensor_pixel_with_the_element_center.py +117 -0
  265. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1613_measure_the_order_of_the_clutter_from_the_contrast_scaling.py +365 -0
  266. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1613_scan_the_speed_of_sound_at_one_time_origin.py +167 -0
  267. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1615_locate_the_source_and_sensor_pixels_of_the_array.py +167 -0
  268. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1617_check_the_data_level_correction_and_the_pulse_band.py +340 -0
  269. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1617_test_local_and_notch_filters_on_the_clutter.py +388 -0
  270. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1621_compute_the_moveout_truth_with_a_chosen_arrival_model.py +304 -0
  271. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1622_measure_the_tilt_spread_of_the_wall_interfaces.py +235 -0
  272. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1623_tabulate_the_broadband_correction_runs.py +135 -0
  273. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1626_measure_the_ghost_depths_of_the_plate.py +134 -0
  274. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1626_score_the_product_of_the_transducer_laws.py +150 -0
  275. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1630_test_the_local_filter_with_padded_windows.py +127 -0
  276. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1632_fit_the_time_origin_and_the_speed_of_the_phantom_scans.py +170 -0
  277. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1634_fit_the_reference_speed_at_the_sensor_row.py +106 -0
  278. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1646_split_the_clutter_into_orders_and_predict_its_floor.py +248 -0
  279. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1652_tabulate_the_pulse_band_check.py +42 -0
  280. fullwave25-1.4.2.dev0/.claude/scratch/20260910_1659_check_the_plane_wave_transform_of_the_elements.py +69 -0
  281. fullwave25-1.4.2.dev0/.claude/scratch/20260916_1103_compare_two_b_mode_roots.py +38 -0
  282. fullwave25-1.4.2.dev0/.claude/scratch/20260916_1214_binary_cache_lookup_order.py +86 -0
  283. fullwave25-1.4.2.dev0/.claude/scratch/20260916_1253_signal_of_old_against_new.py +74 -0
  284. fullwave25-1.4.2.dev0/.claude/scratch/20260916_1300_read_the_numexpr_pool_limit.py +18 -0
  285. fullwave25-1.4.2.dev0/.claude/scratch/20260916_1332_gpu_memory_of_the_relaxation_kernel.py +72 -0
  286. fullwave25-1.4.2.dev0/.claude/scratch/20260916_1401_relaxation_regions_against_the_kernel.py +65 -0
  287. fullwave25-1.4.2.dev0/.claude/scratch/20260916_1420_released_binary_carries_the_fix.py +37 -0
  288. fullwave25-1.4.2.dev0/.claude/scratch/20260916_1601_stable_courant_number_of_the_stencil_table.py +199 -0
  289. fullwave25-1.4.2.dev0/.claude/scratch/20260916_1602_fast_layer_in_a_small_3d_run.py +162 -0
  290. fullwave25-1.4.2.dev0/.claude/scratch/20260916_1719_p4_1_pulse_energy_above_the_trace_nyquist.py +58 -0
  291. fullwave25-1.4.2.dev0/.claude/scratch/20260916_1933_l7_4_run_at_8_ppw_stability_and_trace_sampling.py +73 -0
  292. fullwave25-1.4.2.dev0/.claude/scratch/20260916_1946_l7_4_trace_sampling_by_field_modulus.py +70 -0
  293. fullwave25-1.4.2.dev0/.claude/scratch/20260916_2004_pulse_bands_of_the_two_abdomen_arrays.py +79 -0
  294. fullwave25-1.4.2.dev0/.claude/scratch/20260916_2155_cuda_version_choice_before_and_after.py +90 -0
  295. fullwave25-1.4.2.dev0/.claude/scratch/20260916_2155_gpu_architectures_in_cached_binaries.py +64 -0
  296. fullwave25-1.4.2.dev0/.claude/scratch/20260916_2155_mutation_check_of_the_cuda_version_tests.py +82 -0
  297. fullwave25-1.4.2.dev0/.claude/scratch/20260916_2155_verify_the_cuda_version_test_findings.py +89 -0
  298. fullwave25-1.4.2.dev0/.claude/scratch/20260916_2212_mutation_check_of_the_blackwell_version_choice.py +111 -0
  299. fullwave25-1.4.2.dev0/.claude/scratch/20260925_1321_selected_cuda_tag.py +7 -0
  300. fullwave25-1.4.2.dev0/.claude/scratch/20260925_1326_release_binary_bit_identity.py +459 -0
  301. fullwave25-1.4.2.dev0/.claude/scratch/20260925_1331_summarize_release_check.py +18 -0
  302. fullwave25-1.4.2.dev0/.claude/settings.local.json +20 -0
  303. fullwave25-1.4.2.dev0/.claude/skills/fullwave25/SKILL.md +119 -0
  304. fullwave25-1.4.2.dev0/.claude/three_dimensional/convex_transducer_3d.py +127 -0
  305. fullwave25-1.4.2.dev0/.claude/three_dimensional/linear_transducer_3d.py +140 -0
  306. fullwave25-1.4.2.dev0/.claude/three_dimensional/matrix_transducer_3d.py +135 -0
  307. fullwave25-1.4.2.dev0/.claude/three_dimensional/patch.py +523 -0
  308. fullwave25-1.4.2.dev0/.claude/three_dimensional/ruff.toml +40 -0
  309. fullwave25-1.4.2.dev0/.claude/three_dimensional/superseded/convex_transducer_3d.py +126 -0
  310. fullwave25-1.4.2.dev0/.claude/three_dimensional/superseded/linear_transducer_3d.py +138 -0
  311. fullwave25-1.4.2.dev0/.claude/three_dimensional/superseded/matrix_transducer_3d.py +134 -0
  312. fullwave25-1.4.2.dev0/.claude/three_dimensional/test_patch.py +178 -0
  313. fullwave25-1.4.2.dev0/.claude/transducer_stack/README.md +70 -0
  314. fullwave25-1.4.2.dev0/.claude/transducer_stack/superseded/full_synthetic_aperture_with_stack.py +438 -0
  315. fullwave25-1.4.2.dev0/.claude/transducer_stack/superseded/plane_wave_compounding_with_stack.py +433 -0
  316. {fullwave25-1.4.1.dev2 → fullwave25-1.4.2.dev0}/.gitignore +0 -7
  317. fullwave25-1.4.2.dev0/20260120_0844.log +1158 -0
  318. {fullwave25-1.4.1.dev2 → fullwave25-1.4.2.dev0}/PKG-INFO +21 -1
  319. {fullwave25-1.4.1.dev2 → fullwave25-1.4.2.dev0}/README.md +20 -0
  320. {fullwave25-1.4.1.dev2 → fullwave25-1.4.2.dev0}/docker/Dockerfile +8 -6
  321. {fullwave25-1.4.1.dev2 → fullwave25-1.4.2.dev0}/docker/README.md +1 -1
  322. {fullwave25-1.4.1.dev2 → fullwave25-1.4.2.dev0}/fullwave/__init__.py +1 -1
  323. {fullwave25-1.4.1.dev2 → fullwave25-1.4.2.dev0}/fullwave/solver/binary_manager.py +1 -1
  324. {fullwave25-1.4.1.dev2 → fullwave25-1.4.2.dev0}/fullwave/solver/input_file_writer.py +45 -3
  325. {fullwave25-1.4.1.dev2 → fullwave25-1.4.2.dev0}/fullwave/solver/launcher.py +21 -0
  326. {fullwave25-1.4.1.dev2 → fullwave25-1.4.2.dev0}/fullwave/solver/solver.py +714 -41
  327. fullwave25-1.4.2.dev0/logs/20260815_0356_sweep.log +257 -0
  328. {fullwave25-1.4.1.dev2 → fullwave25-1.4.2.dev0}/pyproject.toml +1 -1
  329. fullwave25-1.4.2.dev0/ruff.log +1177 -0
  330. {fullwave25-1.4.1.dev2 → fullwave25-1.4.2.dev0}/uv.lock +1 -1
  331. {fullwave25-1.4.1.dev2 → fullwave25-1.4.2.dev0}/.pre-commit-config.yaml +0 -0
  332. {fullwave25-1.4.1.dev2 → fullwave25-1.4.2.dev0}/.python-version +0 -0
  333. {fullwave25-1.4.1.dev2 → fullwave25-1.4.2.dev0}/CITATION.cff +0 -0
  334. {fullwave25-1.4.1.dev2 → fullwave25-1.4.2.dev0}/CONTRIBUTING.md +0 -0
  335. {fullwave25-1.4.1.dev2 → fullwave25-1.4.2.dev0}/LICENSE +0 -0
  336. {fullwave25-1.4.1.dev2 → fullwave25-1.4.2.dev0}/Makefile +0 -0
  337. {fullwave25-1.4.1.dev2 → fullwave25-1.4.2.dev0}/attenuation.png +0 -0
  338. {fullwave25-1.4.1.dev2 → fullwave25-1.4.2.dev0}/beamformer.m +0 -0
  339. {fullwave25-1.4.1.dev2 → fullwave25-1.4.2.dev0}/debug_solver_bin/fullwave2_2d_2_relax_multi_gpu_cuda124 +0 -0
  340. {fullwave25-1.4.1.dev2 → fullwave25-1.4.2.dev0}/debug_solver_bin/fullwave2_2d_exponential_attenuation_multi_gpu +0 -0
  341. {fullwave25-1.4.1.dev2 → fullwave25-1.4.2.dev0}/debug_solver_bin/fullwave2_2d_exponential_attenuation_multi_gpu_cuda124 +0 -0
  342. {fullwave25-1.4.1.dev2 → fullwave25-1.4.2.dev0}/debug_solver_bin/fullwave2_2d_exponential_attenuation_multi_gpu_cuda124_ +0 -0
  343. {fullwave25-1.4.1.dev2 → fullwave25-1.4.2.dev0}/debug_solver_bin/fullwave2_3d_exponential_attenuation_multi_gpu_cuda124 +0 -0
  344. {fullwave25-1.4.1.dev2 → fullwave25-1.4.2.dev0}/debug_solver_bin/fullwave2_3d_exponential_attenuation_multi_gpu_cuda124_ +0 -0
  345. {fullwave25-1.4.1.dev2 → fullwave25-1.4.2.dev0}/docker/Dockerfile.dockerignore +0 -0
  346. {fullwave25-1.4.1.dev2 → fullwave25-1.4.2.dev0}/experiments/__init__.py +0 -0
  347. {fullwave25-1.4.1.dev2 → fullwave25-1.4.2.dev0}/experiments/exp_scatterer_diameter.py +0 -0
  348. {fullwave25-1.4.1.dev2 → fullwave25-1.4.2.dev0}/fullwave/beamformer/__init__.py +0 -0
  349. {fullwave25-1.4.1.dev2 → fullwave25-1.4.2.dev0}/fullwave/beamformer/beamformer.py +0 -0
  350. {fullwave25-1.4.1.dev2 → fullwave25-1.4.2.dev0}/fullwave/constants/__init__.py +0 -0
  351. {fullwave25-1.4.1.dev2 → fullwave25-1.4.2.dev0}/fullwave/constants/material_properties.py +0 -0
  352. {fullwave25-1.4.1.dev2 → fullwave25-1.4.2.dev0}/fullwave/grid.py +0 -0
  353. {fullwave25-1.4.1.dev2 → fullwave25-1.4.2.dev0}/fullwave/medium.py +0 -0
  354. {fullwave25-1.4.1.dev2 → fullwave25-1.4.2.dev0}/fullwave/medium_builder/__init__.py +0 -0
  355. {fullwave25-1.4.1.dev2 → fullwave25-1.4.2.dev0}/fullwave/medium_builder/domain.py +0 -0
  356. {fullwave25-1.4.1.dev2 → fullwave25-1.4.2.dev0}/fullwave/medium_builder/medium_builder.py +0 -0
  357. {fullwave25-1.4.1.dev2 → fullwave25-1.4.2.dev0}/fullwave/medium_builder/presets/__init__.py +0 -0
  358. {fullwave25-1.4.1.dev2 → fullwave25-1.4.2.dev0}/fullwave/medium_builder/presets/data/.keep +0 -0
  359. {fullwave25-1.4.1.dev2 → fullwave25-1.4.2.dev0}/fullwave/medium_builder/presets/data/abdominal_wall/i2365f_etfw1.mat +0 -0
  360. {fullwave25-1.4.1.dev2 → fullwave25-1.4.2.dev0}/fullwave/medium_builder/presets/domain_abdominal_wall.py +0 -0
  361. {fullwave25-1.4.1.dev2 → fullwave25-1.4.2.dev0}/fullwave/medium_builder/presets/domain_background.py +0 -0
  362. {fullwave25-1.4.1.dev2 → fullwave25-1.4.2.dev0}/fullwave/medium_builder/presets/domain_scatterer.py +0 -0
  363. {fullwave25-1.4.1.dev2 → fullwave25-1.4.2.dev0}/fullwave/medium_builder/presets/domain_simple.py +0 -0
  364. {fullwave25-1.4.1.dev2 → fullwave25-1.4.2.dev0}/fullwave/medium_builder/presets/domain_water_gel.py +0 -0
  365. {fullwave25-1.4.1.dev2 → fullwave25-1.4.2.dev0}/fullwave/sensor.py +0 -0
  366. {fullwave25-1.4.1.dev2 → fullwave25-1.4.2.dev0}/fullwave/solver/__init__.py +0 -0
  367. {fullwave25-1.4.1.dev2 → fullwave25-1.4.2.dev0}/fullwave/solver/bins/_gpu/2d/num_relax=2/fullwave2_2d_2_relax_multi_gpu_cuda118 +0 -0
  368. {fullwave25-1.4.1.dev2 → fullwave25-1.4.2.dev0}/fullwave/solver/bins/_gpu/2d/num_relax=2/fullwave2_2d_2_relax_multi_gpu_cuda124 +0 -0
  369. {fullwave25-1.4.1.dev2 → fullwave25-1.4.2.dev0}/fullwave/solver/bins/_gpu/2d/num_relax=2/fullwave2_2d_2_relax_multi_gpu_cuda129 +0 -0
  370. {fullwave25-1.4.1.dev2 → fullwave25-1.4.2.dev0}/fullwave/solver/bins/_gpu/2d/num_relax=2/fullwave2_2d_2_relax_multi_gpu_cuda130 +0 -0
  371. {fullwave25-1.4.1.dev2 → fullwave25-1.4.2.dev0}/fullwave/solver/bins/_gpu/3d/num_relax=2/fullwave2_3d_2_relax_multi_gpu_cuda118 +0 -0
  372. {fullwave25-1.4.1.dev2 → fullwave25-1.4.2.dev0}/fullwave/solver/bins/_gpu/3d/num_relax=2/fullwave2_3d_2_relax_multi_gpu_cuda124 +0 -0
  373. {fullwave25-1.4.1.dev2 → fullwave25-1.4.2.dev0}/fullwave/solver/bins/_gpu/3d/num_relax=2/fullwave2_3d_2_relax_multi_gpu_cuda129 +0 -0
  374. {fullwave25-1.4.1.dev2 → fullwave25-1.4.2.dev0}/fullwave/solver/bins/_gpu/3d/num_relax=2/fullwave2_3d_2_relax_multi_gpu_cuda130 +0 -0
  375. {fullwave25-1.4.1.dev2 → fullwave25-1.4.2.dev0}/fullwave/solver/bins/database/relaxation_params_database_num_relax=3_20260828_1513.mat +0 -0
  376. {fullwave25-1.4.1.dev2 → fullwave25-1.4.2.dev0}/fullwave/solver/bins/database/relaxation_params_database_num_relax=3_20260828_1513_invalid_cells.json +0 -0
  377. {fullwave25-1.4.1.dev2 → fullwave25-1.4.2.dev0}/fullwave/solver/bins/database/relaxation_params_database_num_relax=4_20260828_1456.mat +0 -0
  378. {fullwave25-1.4.1.dev2 → fullwave25-1.4.2.dev0}/fullwave/solver/bins/database/relaxation_params_database_num_relax=4_20260828_1456_invalid_cells.json +0 -0
  379. {fullwave25-1.4.1.dev2 → fullwave25-1.4.2.dev0}/fullwave/solver/cuda_utils.py +0 -0
  380. {fullwave25-1.4.1.dev2 → fullwave25-1.4.2.dev0}/fullwave/solver/pml_builder.py +0 -0
  381. {fullwave25-1.4.1.dev2 → fullwave25-1.4.2.dev0}/fullwave/solver/shipped_database.py +0 -0
  382. {fullwave25-1.4.1.dev2 → fullwave25-1.4.2.dev0}/fullwave/solver/source_type.py +0 -0
  383. {fullwave25-1.4.1.dev2 → fullwave25-1.4.2.dev0}/fullwave/solver/utils.py +0 -0
  384. {fullwave25-1.4.1.dev2 → fullwave25-1.4.2.dev0}/fullwave/source.py +0 -0
  385. {fullwave25-1.4.1.dev2 → fullwave25-1.4.2.dev0}/fullwave/transducer.py +0 -0
  386. {fullwave25-1.4.1.dev2 → fullwave25-1.4.2.dev0}/fullwave/transmit.py +0 -0
  387. {fullwave25-1.4.1.dev2 → fullwave25-1.4.2.dev0}/fullwave/utils/__init__.py +0 -0
  388. {fullwave25-1.4.1.dev2 → fullwave25-1.4.2.dev0}/fullwave/utils/check_functions.py +0 -0
  389. {fullwave25-1.4.1.dev2 → fullwave25-1.4.2.dev0}/fullwave/utils/coordinates.py +0 -0
  390. {fullwave25-1.4.1.dev2 → fullwave25-1.4.2.dev0}/fullwave/utils/memory_tempfile.py +0 -0
  391. {fullwave25-1.4.1.dev2 → fullwave25-1.4.2.dev0}/fullwave/utils/numerical.py +0 -0
  392. {fullwave25-1.4.1.dev2 → fullwave25-1.4.2.dev0}/fullwave/utils/plot_utils.py +0 -0
  393. {fullwave25-1.4.1.dev2 → fullwave25-1.4.2.dev0}/fullwave/utils/pulse.py +0 -0
  394. {fullwave25-1.4.1.dev2 → fullwave25-1.4.2.dev0}/fullwave/utils/relaxation_parameters.py +0 -0
  395. {fullwave25-1.4.1.dev2 → fullwave25-1.4.2.dev0}/fullwave/utils/scatterer.py +0 -0
  396. {fullwave25-1.4.1.dev2 → fullwave25-1.4.2.dev0}/fullwave/utils/signal_filter.py +0 -0
  397. {fullwave25-1.4.1.dev2 → fullwave25-1.4.2.dev0}/fullwave/utils/signal_process.py +0 -0
  398. {fullwave25-1.4.1.dev2 → fullwave25-1.4.2.dev0}/ruff.toml +0 -0
  399. {fullwave25-1.4.1.dev2 → fullwave25-1.4.2.dev0}/signal_filter_example.png +0 -0
@@ -1,5 +1,5 @@
1
1
  [tool.bumpversion]
2
- current_version = "1.4.1-dev2"
2
+ current_version = "1.4.2-dev0"
3
3
  parse = """(?x)
4
4
  (?P<major>0|[1-9]\\d*)\\.
5
5
  (?P<minor>0|[1-9]\\d*)\\.
@@ -0,0 +1 @@
1
+ *.pyc
@@ -0,0 +1,162 @@
1
+ # Dead Code Report — fullwave25
2
+
3
+ **Date:** 2026-09-11
4
+ **Branch:** develop
5
+ **Scope:** `fullwave/`, `tests/`, `examples/` (including the 6 example notebooks)
6
+
7
+ ## Method
8
+
9
+ 1. `ruff check` (config in `ruff.toml`, F/ARG rules enabled) — already clean, so no
10
+ unused imports, locals, or function arguments remain in the library.
11
+ 2. `vulture 2.16 --min-confidence 0` over `fullwave tests examples` — 77 findings.
12
+ 3. Every finding hand-verified against:
13
+ - the 6 example notebooks (vulture does **not** parse `.ipynb`),
14
+ - the `__all__` public API exports,
15
+ - README / docstring references,
16
+ - near-miss names (e.g. `ncoords` property vs the `ncoords.dat` solver file key,
17
+ `n_relaxation` vs `n_relaxation_mechanisms`, `gettempprefix` vs stdlib
18
+ `tempfile.gettempprefixb`).
19
+
20
+ Result: 77 findings → **33 dead items in the library** (25 internal + 8 public API),
21
+ **5+ dead test helpers**, the remainder confirmed false positives.
22
+
23
+ ---
24
+
25
+ ## A. Confirmed dead — internal/private (safe to delete, non-breaking)
26
+
27
+ ### A.1 The `n_coords_zero` family (standout finding)
28
+
29
+ Four independent definitions, **zero callers anywhere** in the repo:
30
+
31
+ | Location | Item |
32
+ |---|---|
33
+ | `fullwave/medium.py:587` | `Medium.n_coords_zero` |
34
+ | `fullwave/medium.py:1075` | `MediumExponentialAttenuation.n_coords_zero` |
35
+ | `fullwave/medium.py:1417` | `MediumRelaxationMaps.n_coords_zero` |
36
+ | `fullwave/solver/pml_builder.py:490` | `PMLBuilder.n_coords_zero` (method) |
37
+
38
+ ### A.2 Stale class attributes
39
+
40
+ | Location | Item | Evidence |
41
+ |---|---|---|
42
+ | `fullwave/medium.py:257` | `MediumRelaxationMaps.use_regression: bool = False` | defined once; never assigned in `__init__`, never read |
43
+ | `fullwave/solver/pml_builder.py:166` | `n_relaxation: int` field annotation | never assigned or read; all other grep hits are the distinct, very much alive `n_relaxation_mechanisms` |
44
+
45
+ ### A.3 `fullwave/utils/numerical.py` — 6 of 8 functions dead
46
+
47
+ Only two functions in this module are alive:
48
+
49
+ - `matlab_round` (line 22) — used in `fullwave/solver/input_file_writer.py` (lines 776, 787, 837, 931) and `tests/solver/test_input_file_writer.py`.
50
+ - `matlab_interp2easy` (line 36) — used in `fullwave/medium_builder/presets/domain_abdominal_wall.py:50`.
51
+
52
+ Dead:
53
+
54
+ | Location | Item | Evidence |
55
+ |---|---|---|
56
+ | `fullwave/utils/numerical.py:10` | `seed_everything` | only own def |
57
+ | `fullwave/utils/numerical.py:17` | `normalize_255` | only own def |
58
+ | `fullwave/utils/numerical.py:27` | `matlab_gaussian_filter` | only a commented-out call in `domain_abdominal_wall.py:131–134` |
59
+ | `fullwave/utils/numerical.py:58` | `matlab_interp2easy_3d` | only own def (the 3D sibling of the used 2D version) |
60
+ | `fullwave/utils/numerical.py:91` | `detect_envelope` | only own def |
61
+ | `fullwave/utils/numerical.py:96` | `cut_domain` | only own def |
62
+
63
+ ### A.4 Private helpers, zero references beyond own defs
64
+
65
+ | Location | Item |
66
+ |---|---|
67
+ | `fullwave/solver/pml_builder.py:695` | `_extend_arrays_sequential_gpu` |
68
+ | `fullwave/solver/pml_builder.py:1475` | `_sort_relaxation_param_dict` |
69
+ | `fullwave/medium_builder/medium_builder.py:122` | `MediumBuilder.register_domain_list` |
70
+ | `fullwave/medium_builder/presets/domain_scatterer.py:164` | `_rescell3ds` (only call is commented out at line 116) |
71
+ | `fullwave/utils/plot_utils.py:289` | `plot_wave_propagation_animation` |
72
+ | `fullwave/utils/plot_utils.py:1123` | `plot_maximum_intensity_projection` |
73
+ | `fullwave/utils/signal_process.py:13` | `signed_power_compression` |
74
+ | `fullwave/utils/signal_process.py:35` | `reshape_whole_sensor_to_nx_ny_nt` |
75
+
76
+ ### A.5 Vendored `MemoryTempfile` (`fullwave/utils/memory_tempfile.py`)
77
+
78
+ Vendored from mbello/memory-tempfile; the dead methods are part of the upstream API
79
+ surface, so removal is optional and should keep the vendoring tidy (or be skipped):
80
+
81
+ | Location | Item |
82
+ |---|---|
83
+ | line 125 | `found_mem_tempdir` |
84
+ | line 136 | `using_mem_tempdir` |
85
+ | line 148 | `get_usable_mem_tempdir_paths` |
86
+ | line 170 | `gettempdirb` |
87
+ | line 421 | `gettempprefix` |
88
+
89
+ > Caution: line 443 calls the **stdlib** `tempfile.gettempprefixb()` inside the
90
+ > separate `gettempprefixb` method (line 434) — do not conflate `gettempprefix`
91
+ > (dead) with `gettempprefixb` (live, stdlib passthrough).
92
+
93
+ **Category A total: 25 dead items.**
94
+
95
+ ---
96
+
97
+ ## B. Confirmed dead but public API (removal = semver break — needs deprecation first)
98
+
99
+ | Location | Item | Notes |
100
+ |---|---|---|
101
+ | `fullwave/__init__.py:68` | `VERSION = __version__` | zero internal references; importable as `fullwave.VERSION` ("for convenience") |
102
+ | `fullwave/grid.py:100` | `Grid.n_axial` | property; only a docstring mention in `fullwave/beamformer.py:79` |
103
+ | `fullwave/grid.py:110` | `Grid.n_elevational` | property; same as above |
104
+ | `fullwave/source.py:397` | `Source.ncoords` | the `ncoords` grep hits are the `ncoords.dat` solver-file key in `input_file_writer.py` (lines 1212, 1323), not this property |
105
+ | `fullwave/transducer.py:675` | `Transducer.indexed_element_mask_input_px` | no references in library, tests, or notebooks |
106
+ | `fullwave/transducer.py:1573` | `Transducer.element_surface_to_elemnt_id` | typo in the name; no references |
107
+ | `fullwave/transducer.py:1893` | `LinearTransducer` (class) | legacy; the exercised path is `Transducer` + `TransducerGeometry` |
108
+ | `fullwave/transducer.py:1942` | `make_p4_1c_trasnducer` (factory) | legacy; typo in the name |
109
+
110
+ **Category B total: 8 dead items.**
111
+
112
+ ---
113
+
114
+ ## C. Confirmed NOT dead (vulture false positives — do not remove)
115
+
116
+ | Item | Why it is alive |
117
+ |---|---|
118
+ | `Transducer.diverging` (`transducer.py:1221`) | Documented public API in `README.md:212`. Distinct from `transmit.diverging_delays` (`fullwave/transmit.py:147`) |
119
+ | `Transducer.dict_source_index_to_location` (`transducer.py:1701`) | Used by 3 example notebooks |
120
+ | `logging.Formatter.converter = time.gmtime` (`fullwave/__init__.py:22`) | Intentional logging idiom (force GMT timestamps) |
121
+ | `matlab_round`, `matlab_interp2easy` (`numerical.py`) | Actively used — see A.3 |
122
+ | `pytestmark` (`tests/test_cupy_equivalence.py:29`) | pytest module-level marker variable |
123
+ | `return_value` flags (`test_signal_filter.py:188`, `test_solver.py:281–283`, `test_init.py:55/71/87`) | `mock.patch(..., return_value=...)` / `Mock(return_value=...)` — read dynamically by the mock machinery |
124
+ | `check`, `shell` (`tests/solver/test_launcher.py:12/18/57/266/285`) | Dummy functions that must mimic `subprocess.run`'s call signature; parameters are intentionally unread |
125
+ | `inst` (×11, `tests/solver/test_input_file_writer.py`) | Truly assigned-but-never-read patcher locals — dead but harmless (see D) |
126
+
127
+ ---
128
+
129
+ ## D. Dead test helpers (low priority, tests-only)
130
+
131
+ | Location | Item |
132
+ |---|---|
133
+ | `tests/medium_builder/presets/test_domain_background.py:29` | `get_named_properties` |
134
+ | `tests/solver/test_gpu_memory_estimate.py:66` | `_patch_binary` |
135
+ | `tests/solver/test_pml_builder_zero_attenuation_gate.py:342` | `_build_with_coords` |
136
+ | `tests/solver/test_signal_filter.py:17` | `_make_signal` |
137
+ | `tests/test_source.py:297` | `_base_source` |
138
+ | `tests/test_cupy_equivalence.py` (7 sites: lines 103, 159, 238, 550, 597, 632, 762) | `_patch` methods — defined but never called (zero `self._patch(...)` call sites) |
139
+ | `tests/solver/test_input_file_writer.py` (11 sites, 100% confidence) | unused `inst` locals — assigned, never read; harmless cleanup |
140
+
141
+ ---
142
+
143
+ ## Recommended action plan
144
+
145
+ 1. **One non-breaking commit for category A** — nothing in A is referenced by any
146
+ notebook, test, or doc example. `n_coords_zero` (4 sites) and the six dead
147
+ `numerical.py` functions are the bulk of it.
148
+ 2. **Deprecation pass for category B** — add `DeprecationWarning`s (or remove in a
149
+ 2.0.0) for `VERSION`, `Grid.n_axial/n_elevational`, `Source.ncoords`, and the four
150
+ transducer items. Check `__all__` and the README before removing each.
151
+ 3. **Optional:** tidy category D and the vendored `MemoryTempfile` methods.
152
+ 4. **CI guard (optional):** add vulture to the pre-commit / CI pipeline with a
153
+ baseline file to keep the count from regrowing.
154
+
155
+ ## Caveats
156
+
157
+ - Vulture at 60% confidence can still miss dynamic dispatch (e.g. string-based
158
+ attribute access, `getattr`, notebook `ipynb` cells were checked manually but not
159
+ mechanically). Categories A and B were each verified by direct grep + notebook
160
+ token scan; treat any *new* vulture finding the same way before deleting.
161
+ - The vendored `memory_tempfile.py` is third-party code; removals there are cosmetic.
162
+ - This report is identification only — no code was changed.
@@ -0,0 +1,13 @@
1
+ Speed up input generation for large grids and pin fullwave_bin_v1.4.2
2
+
3
+ Input generation for large 3D grids was slow and used a lot of memory. This change removes redundant whole-grid copies and computations, uses numexpr and threads for the remaining array work, and writes files in slabs. The generated input files are byte-identical.
4
+
5
+ - medium: skip zero maps that are replaced right away, add compute_coefficients and build_coefficients(), and fix the CuPy backend in _make_the_lossless_voxels_lossless.
6
+ - pml_builder: release the unpadded maps, apply ramps and the entrance frequency splice in place, compute coefficients with numexpr one task at a time, copy layer maps on threads, and log the main stages.
7
+ - relaxation_parameters: use numexpr for the first-order attenuation scaling.
8
+ - input_file_writer: write maps and the source matrix in slabs.
9
+ - transmit: build each distinct source pulse once in signal_of.
10
+ - fullwave: set the numexpr thread count to the detected cores, up to 64, unless a thread variable is set.
11
+ - binary_manager: pin fullwave_bin_v1.4.2.
12
+
13
+ Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@@ -0,0 +1,31 @@
1
+ ## Speed up input generation for large grids and pin fullwave_bin_v1.4.2
2
+
3
+ ### Summary
4
+
5
+ Input generation for large 3D grids was slow and used a lot of memory. numexpr ran with its default of 16 threads, several whole-grid arrays were copied on one thread, and some arrays were computed only to be replaced. This PR removes that work. The generated input files are byte-identical before and after.
6
+
7
+ ### Changes
8
+
9
+ - `MediumRelaxationMaps` no longer allocates zero maps that are replaced right away. A new `compute_coefficients` option and `build_coefficients()` method let the PML builder skip coefficients it overwrites.
10
+ - The PML builder releases the unpadded relaxation maps once the padded maps exist.
11
+ - PML ramps and the entrance frequency splice are applied in place on the boundary layers.
12
+ - PML coefficients and the first-order attenuation scaling use numexpr, and layer maps are copied on threads.
13
+ - Maps and the source matrix are written in slabs.
14
+ - `signal_of` builds each distinct source pulse once.
15
+ - At import, numexpr uses the detected cores up to 64, unless `NUMEXPR_MAX_THREADS`, `NUMEXPR_NUM_THREADS` or `OMP_NUM_THREADS` is set.
16
+ - The CuPy backend of `Medium` works again. `_make_the_lossless_voxels_lossless` now uses the array's own module.
17
+ - The main input generation stages are logged at info level.
18
+ - `BINARY_RELEASE_TAG` is `fullwave_bin_v1.4.2`.
19
+
20
+ ### Verification
21
+
22
+ - Input files for 2D and 3D test grids of up to 45 M padded cells are byte-identical before and after.
23
+ - Peak host memory on the 45 M cell grid is 25 to 33 percent lower.
24
+ - The tests for the medium, the PML builder, the input file writer, the relaxation parameters, the transmit, the pulse, the transducer, the source, the package init and the CuPy equivalence pass.
25
+
26
+ ### Notes for review
27
+
28
+ - Importing `fullwave` changes the numexpr thread count when no thread variable is set.
29
+ - `PMLBuilder.medium_org` now holds the medium as it was given.
30
+
31
+ 🤖 Generated with [Claude Code](https://claude.com/claude-code)
@@ -0,0 +1,10 @@
1
+ Count relaxation GPU memory by the region-trimmed layout
2
+
3
+ The GPU memory estimate of the relaxation solver counted every array over the whole slab, divided the sources by the number of GPUs, and counted only the hard source. The solver stores the higher mechanisms over the interior box and the momentum layer over the band only, and each GPU holds every source.
4
+
5
+ - solver: _mem_relaxation counts the region-trimmed layout and takes band and interior cell counts, which default to the whole slab.
6
+ - solver: read the interior box and the momentum layer hole from the absorbing layer maps along the center lines, and give each GPU its share.
7
+ - solver: count every source kind and every zero pressure coordinate on each GPU, and log the estimate in GiB.
8
+ - tests: update the relaxation formula tests and add region and 4 GPU cases.
9
+
10
+ Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@@ -0,0 +1,24 @@
1
+ ## Count relaxation GPU memory by the region-trimmed layout
2
+
3
+ ### Summary
4
+
5
+ The GPU memory estimate for relaxation runs was about 2.5 times too high. It counted every array over the whole slab, but the solver stores the higher mechanisms over the interior box and the momentum absorbing layer over the band only. It also divided the sources by the number of GPUs and counted only the hard source, while each GPU holds every source.
6
+
7
+ ### Changes
8
+
9
+ - `_mem_relaxation` counts the region-trimmed layout. New keyword arguments `band` and `interior` give the band and box cell counts, and each defaults to the whole slab.
10
+ - New `_relaxation_regions` reads the interior box from the nonzero cells of `a_pml_u2` and above, and the hole from the zero cells of `a_pml_x1`, along the center lines of each axis.
11
+ - New `_band_and_interior` gives each GPU its share, including its halo rows.
12
+ - `_estimate_gpu_memory` counts every source kind and every zero pressure coordinate on each GPU, and logs the estimate in GiB.
13
+
14
+ ### Verification
15
+
16
+ - `tests/solver/test_gpu_memory_estimate.py` is updated for the layout, with new cases for the regions and a 1407 × 659 × 659 grid on 4 GPUs. There the estimate is 17.3 to 18.4 GiB per GPU, close to the observed use, where the old estimate was 45 to 46 GiB.
17
+ - On a 3D test grid, the box and hole read here match the ones the solver measures.
18
+
19
+ ### Notes for review
20
+
21
+ - The log unit changes from GB to GiB. The values were already computed in GiB.
22
+ - The estimate matches the counting in the solver's `gpu_memory_nrelax.cuh`.
23
+
24
+ 🤖 Generated with [Claude Code](https://claude.com/claude-code)
@@ -0,0 +1,10 @@
1
+ Choose the CUDA build from the driver version and the GPU architecture
2
+
3
+ The solver refused a driver that supports a CUDA version newer than 13.1, although a driver also runs binaries built with an older CUDA version. The version choice also ignored the GPU architecture, and the result of the version and architecture check was discarded.
4
+
5
+ - solver: _make_cuda_version_option takes the architecture and picks the newest CUDA version with a build for it that is not newer than the driver. It raises only where no such build exists.
6
+ - solver: remove COMPATIBLE_CUDA_VERSIONS and COMPATIBLE_CUDA_RANGES, so the version and architecture set is the one table of builds.
7
+ - solver: _retrieve_fullwave_simulation_path passes the architecture and raises where the version and architecture pair has no build.
8
+ - tests: replace the refusal of a newer driver, and add cases for a newer driver, an architecture without a CUDA 13.0 build, a driver older than every build, and the binary path for a newer driver on sm_90.
9
+
10
+ Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@@ -0,0 +1,25 @@
1
+ ## Choose the CUDA build from the driver version and the GPU architecture
2
+
3
+ ### Summary
4
+
5
+ A driver that supports CUDA 13.2 was refused with `CUDA version 13.2 is not in the compatible ranges: [(11.8, 13.1)]`. The version the check reads is the newest CUDA version the driver supports, and a driver also runs binaries built with an older CUDA version, so the upper bound refused drivers that can run the builds. The version choice also ignored the GPU architecture, and `_retrieve_fullwave_simulation_path` discarded the result of `_check_compatible_set`.
6
+
7
+ ### Changes
8
+
9
+ - `_make_cuda_version_option` takes a new keyword argument `cuda_arch`. On the GPU it picks the newest CUDA version in `COMPATIBLE_CUDA_VERSIONS_ARCHITECTURES_set` for that architecture that is not newer than the driver, and it raises only where no such build exists.
10
+ - `COMPATIBLE_CUDA_VERSIONS` and `COMPATIBLE_CUDA_RANGES` are removed. The version and architecture set is the one table of builds. The list also named 13.1, which has no build in the set.
11
+ - `_retrieve_fullwave_simulation_path` passes the architecture and raises where the version and architecture pair has no build.
12
+
13
+ ### Verification
14
+
15
+ - `tests/solver/test_solver.py` passes, 33 tests on the CPU. The test that expected a refusal of a CUDA 14.0 driver is replaced. New cases cover a 13.2 driver on `sm_90` and a 14.0 driver on `sm_89`, both giving `cuda130`, and a 13.2 driver on `sm_61`, which gives `cuda129`. They also cover a driver older than every build, a 12.6 driver on `sm_120`, and the 3D binary path for a 13.2 driver on `sm_90`.
16
+ - `ruff check` passes on both files.
17
+ - `tests/solver/test_solver_generate_only.py` needs a GPU and was not run on one.
18
+
19
+ ### Notes for review
20
+
21
+ - A driver that supports CUDA 13.2 on `sm_90` now resolves to the `cuda130` build, because the set lists `(13.0, "sm_90")`. The binary release must carry that file. If it does not, the download fails and names the file.
22
+ - Nothing changes for `use_gpu=False`, or where the driver version has a build for the GPU architecture. A driver older than every build for its architecture, such as 12.6 on `sm_120`, now raises where it used to pick a version with no build.
23
+ - The fallback warning now names the architecture.
24
+
25
+ 🤖 Generated with [Claude Code](https://claude.com/claude-code)
@@ -0,0 +1,10 @@
1
+ Tighten the CUDA version choice tests
2
+
3
+ A mutation check showed three changes to the version choice that the tests did not catch.
4
+
5
+ - tests: the CPU mode test uses a driver version with no build, so it checks that the version is returned unchecked.
6
+ - tests: the two CPU path tests no longer patch `_check_compatible_set`, so they check that the pair check is skipped on the CPU.
7
+ - tests: a path test on sm_61 with a 13.2 driver checks that the architecture reaches the version choice.
8
+ - tests: correct the comment on the first sm_120 build.
9
+
10
+ Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@@ -0,0 +1,9 @@
1
+ Run Blackwell GPUs on a CUDA 12.8 driver, and add sm_103
2
+
3
+ The first build for a Blackwell GPU is CUDA 12.9, and a Blackwell GPU needs a driver of CUDA 12.8 or newer, so a 12.8 driver was refused. A build of the driver's CUDA major version runs on that driver through CUDA minor version compatibility.
4
+
5
+ - solver: where no build for the architecture is as old as the driver, take the oldest build of the driver's CUDA major version and warn that it runs through minor version compatibility. An older build is still preferred.
6
+ - solver: add sm_103 to COMPATIBLE_CUDA_ARCHITECTURES and (12.9, "sm_103") to the version and architecture set. The CUDA 12.9 binaries carry sm_103 device code.
7
+ - tests: Blackwell architectures on a 12.8 driver, the preference for an older build, the oldest newer build of the major version, refusals across major versions, the Blackwell binary path, and a check that the architecture list and the set name the same GPUs.
8
+
9
+ Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@@ -0,0 +1,23 @@
1
+ ## Run Blackwell GPUs on a CUDA 12.8 driver, and add sm_103
2
+
3
+ ### Summary
4
+
5
+ A Blackwell GPU needs a driver of CUDA 12.8 or newer, and its first build is CUDA 12.9. The version choice took only builds as old as the driver, so a Blackwell GPU on a 12.8 driver was refused. A program built with a CUDA 12 toolkit also runs on a driver of an older CUDA 12 version through CUDA minor version compatibility, where it needs no just-in-time compile. The CUDA 12.9 binaries hold precompiled device code for every Blackwell architecture. The architecture list also missed sm_103, which the version and architecture set already named for CUDA 13.0.
6
+
7
+ ### Changes
8
+
9
+ - `_make_cuda_version_option` still prefers the newest build that is not newer than the driver. Where none exists, it takes the oldest build of the driver's CUDA major version and warns that it runs through minor version compatibility. It raises only where the architecture has neither.
10
+ - `sm_103` is added to `COMPATIBLE_CUDA_ARCHITECTURES`, and `(12.9, "sm_103")` to `COMPATIBLE_CUDA_VERSIONS_ARCHITECTURES_set`.
11
+
12
+ ### Verification
13
+
14
+ - `tests/solver/test_solver.py` passes, 45 tests on the CPU. New cases cover a 12.8 driver on sm_100, sm_101, sm_103, sm_120 and sm_121, which gives `cuda129` with the warning. They also cover a 12.6 driver on sm_89, which still gives `cuda124`, a 12.9 driver on sm_89, which gives `cuda129`, and an 11.4 driver on sm_89, which gives `cuda118`. A 10.2 driver on sm_89 and an 11.8 driver on sm_120 raise. Further cases cover the 2D binary path on sm_120 with a 12.8 driver, and a check that the architecture list and the set name the same GPUs.
15
+ - 13 in-memory changes to the version choice each fail at least one test. They include taking the newest build of the major version, trying minor version compatibility before an older build, dropping the fallback, accepting any major version, and removing sm_103 from the list.
16
+ - The device code entries of the CUDA 12.9 binaries were read from their fat binary sections. All are precompiled, and none is PTX.
17
+ - `ruff check` passes. No Blackwell GPU ran a binary.
18
+
19
+ ### Notes for review
20
+
21
+ - A driver of an older CUDA 11 version now runs the 11.8 build where it has no older build. CUDA 11 minor version compatibility needs driver 450.80.02 or newer, and a driver of CUDA 11.0 older than that is not checked here.
22
+
23
+ 🤖 Generated with [Claude Code](https://claude.com/claude-code)
@@ -0,0 +1,286 @@
1
+ # CLAUDE.md
2
+
3
+ This file onboards Claude Code to the `fullwave25` project.
4
+
5
+ You are assisting with a **Python wrapper around a CUDA/C++ ultrasound FDTD simulator** (Fullwave 2.5). The key goals are:
6
+
7
+ - Make it easy to write, run, and debug ultrasound wave propagation simulations from Python.
8
+ - Keep the Python API high level and "k-Wave-like", while delegating heavy computation to a GPU backend.
9
+ - Preserve physical correctness (FDTD, power‑law attenuation) and performance (multi‑GPU, memory aware).
10
+
11
+ ---
12
+
13
+ ## 1. High‑level overview
14
+
15
+ ### 1.1 What this project does
16
+
17
+ - Simulates 2D and 3D ultrasound wave propagation using a staggered‑grid FDTD scheme (8th order in space, 4th order in time).
18
+ - Models attenuation using heterogeneous power‑law attenuation, \(\alpha = \alpha_0 f^\gamma\), where both \(\alpha_0\) and \(\gamma\) can vary spatially.
19
+ - Provides a Python interface that:
20
+ - Builds computational grids and heterogeneous media.
21
+ - Configures acoustic sources (e.g., plane wave, linear/convex transducers).
22
+ - Configures sensors/receivers.
23
+ - Launches CUDA/C simulations on one or more NVIDIA GPUs.
24
+ - Handles basic visualization and movie export for wavefields and fields of view.
25
+ - The Python package is published as `fullwave25` on PyPI (`pip install fullwave25`).
26
+
27
+ The core numerical engine (FDTD + attenuation, domain decomposition, multi‑GPU scheduling) is implemented in CUDA/C and exposed via a Python wrapper.
28
+
29
+ ### 1.2 Intended users and workflows
30
+
31
+ Typical users are ultrasound researchers and engineers who:
32
+
33
+ - Want high‑fidelity ultrasound simulations in 2D or 3D.
34
+ - Need heterogeneous, frequency‑dependent attenuation (e.g., abdominal wall, air inclusions, layered tissues).
35
+ - Run experiments such as:
36
+ - Plane wave imaging and compounding.
37
+ - Linear and convex array imaging (including abdominal wall).
38
+ - 3D propagation examples with and without air inclusions.
39
+ - Medium design via simple geometric primitives ("medium builder").
40
+
41
+ Common workflows:
42
+
43
+ 1. Install with `pip install fullwave25` (or from source for development).
44
+ 2. Start from a tutorial notebook (e.g., `examples/simple_plane_wave/example_simple_plane_wave.ipynb`) or Colab link.
45
+ 3. Define:
46
+ - Computational grid.
47
+ - Medium (density, sound speed, attenuation \(\alpha_0\), exponent \(\gamma\)).
48
+ - Source (transducer geometry, waveform).
49
+ - Sensor configuration.
50
+ 4. Run the simulation and visualize results (2D, 3D slices, movies).
51
+ 5. Iterate on parameters, medium structure, or transmit schemes (plane waves, focused beams, compounding, synthetic aperture).
52
+
53
+ ---
54
+
55
+ ## 2. Architecture and key components
56
+
57
+ You should treat this project as:
58
+
59
+ - A **Python front‑end** for configuration, I/O, plotting, and utilities.
60
+ - A **CUDA/C backend** that runs the numerical solver.
61
+
62
+ At a high level:
63
+
64
+ - **Python layer**:
65
+ - Defines grid and medium structures.
66
+ - Sets up boundary conditions, attenuation parameters, and sources/sensors.
67
+ - Marshals data to/from GPU memory through C/CUDA bindings.
68
+ - Provides example scripts and notebooks that serve as templates for new simulations.
69
+ - Includes a "medium builder" utility to programmatically construct heterogeneous media.
70
+
71
+ - **CUDA/C layer**:
72
+ - Implements the staggered‑grid FDTD solver with multiple relaxation processes.
73
+ - Implements stretched‑coordinate spatial derivatives (\(\nabla_1\), \(\nabla_2\)) for power‑law attenuation and dispersion.
74
+ - Handles multi‑GPU domain decomposition along depth (x) and coordinating MPI/CUDA or similar primitives.
75
+ - Manages memory layout with the convention (x, y, z) = (depth, lateral, elevational) for efficiency.
76
+
77
+ When modifying code:
78
+
79
+ - Assume the Python API should remain stable and user friendly; breaking changes should be deliberate and documented.
80
+ - Keep in mind that cuda kernel is stored as a binary.
81
+
82
+ ### Claude usage
83
+
84
+ - When changing logic, only edit:
85
+ - fullwave/\*
86
+ - tests/\*
87
+ - Prefer plans first, then code.
88
+ - Write small test drivers for new patterns
89
+
90
+ ---
91
+
92
+ ## 3. Conventions and gotchas
93
+
94
+ ### 3.1 Coordinate conventions
95
+
96
+ - The simulation grid is ordered as:
97
+ - \(x\): depth
98
+ - \(y\): lateral
99
+ - \(z\): elevational
100
+ - Domain decomposition for multi‑GPU execution happens in the **depth** dimension.
101
+ - Internally, indices are in **C‑array order** (row‑major) regardless of how the user conceptualizes coordinates. This is a frequent source of confusion when placing sources and receivers.
102
+
103
+ When writing helper code, comments, or new APIs, be explicit about:
104
+
105
+ - Physical coordinates vs array indices.
106
+ - The order (x, y, z) and how it maps to numpy arrays, C arrays, and GPU memory.
107
+
108
+ ### 3.2 GPU and system requirements
109
+
110
+ - Linux environment is assumed. For Windows users, WSL2 is recommended.
111
+ - NVIDIA GPU is required; multiple GPUs are recommended for realistic 3D runs.
112
+ - GPU memory can be a hard constraint in 3D:
113
+ - Prefer down‑scaling grid sizes or enabling multi‑GPU.
114
+ - Encourage users to inspect usage via `nvidia-smi` or `nvtop`.
115
+
116
+ When generating new examples or tests, keep GPU memory and runtime reasonable.
117
+
118
+ ### 3.3 Dependencies and system tools
119
+
120
+ - Python package: `fullwave25` (PyPI).
121
+ - Development environment uses `uv` for environment and dependency management.
122
+ - Some plotting/animation functions depend on:
123
+ - `ffmpeg` for video encoding.
124
+ - `opencv-python` (`cv2`) for certain video writers.
125
+
126
+ If code you write uses video output:
127
+
128
+ - Make it fail gracefully if `ffmpeg` or `cv2` is missing.
129
+ - Keep error messages explicit (e.g. "Install ffmpeg via `sudo apt install ffmpeg` on Ubuntu").
130
+
131
+ ---
132
+
133
+ ## 4. How to run and test
134
+
135
+ ### 4.1 User installation
136
+
137
+ For typical users:
138
+
139
+ ```bash
140
+ pip install fullwave25
141
+ ```
142
+
143
+ If they need plotting video support:
144
+
145
+ ```bash
146
+ # Ubuntu/Debian
147
+ sudo apt install ffmpeg
148
+ sudo apt install python3-opencv # or: pip install opencv-python
149
+ ```
150
+
151
+ Encourage users to start from the basic examples:
152
+
153
+ - `examples/simple_plane_wave/example_simple_plane_wave.ipynb`
154
+ - Or the provided Google Colab notebook.
155
+
156
+ ### 4.2 Development setup
157
+
158
+ Assume the developer has Git, Python, and an NVIDIA GPU.
159
+
160
+ Recommended steps:
161
+
162
+ ```bash
163
+ # Clone via SSH (preferred for frequent contributors)
164
+ git clone git@github.com:pinton-lab/fullwave25.git
165
+ cd fullwave25
166
+
167
+ # Install uv if missing
168
+ curl -LsSf https://astral.sh/uv/install.sh | sh
169
+
170
+ # Install dev environment
171
+ make install-all-extras # full environment for running examples
172
+ # or
173
+ make install # core library only
174
+
175
+ # Verify everything
176
+ make test
177
+ ```
178
+
179
+ If adding new tests, hook them into the existing test runner so `make test` remains a single entry point.
180
+
181
+ ---
182
+
183
+ ## 5. Example‑driven usage patterns
184
+
185
+ The examples directory is the main guide to intended usage. When in doubt, follow their structure.
186
+
187
+ ### 5.1 2D simulations
188
+
189
+ Examples include:
190
+
191
+ - Simple plane wave.
192
+ - Plane wave with air inclusion.
193
+ - Linear transducer (standard plane wave, focused transmit, abdominal wall).
194
+ - Plane wave compounding and full synthetic aperture (via Colab scripts).
195
+ - Convex transducer with abdominal wall.
196
+
197
+ Patterns to preserve:
198
+
199
+ - A clear sequence:
200
+ 1. Define grid.
201
+ 2. Define medium (including attenuation maps).
202
+ 3. Define transducer/source.
203
+ 4. Define receivers.
204
+ 5. Run simulation.
205
+ 6. Save/visualize outputs.
206
+
207
+ ### 5.2 3D simulations
208
+
209
+ Examples include:
210
+
211
+ - Simple 3D plane wave.
212
+ - 3D plane wave with air inclusion.
213
+ - 3D medium builder usage.
214
+
215
+ In 3D:
216
+
217
+ - Some plotting utilities from 2D are not available or are adapted to slice views (x–y, x–z slices).
218
+ - Simulations are more expensive; any new 3D examples should keep domain sizes and timesteps moderate.
219
+
220
+ ### 5.3 Medium builder
221
+
222
+ The medium builder provides a simple API for creating heterogeneous media via geometric compositions.
223
+
224
+ When writing code that interacts with medium builder:
225
+
226
+ - Treat it as the standard way to define complex heterogeneous media (e.g., abdominal wall, air pockets).
227
+ - Keep the API compositional and declarative (define shapes, positions, and property maps rather than manually editing arrays).
228
+
229
+ ---
230
+
231
+ ## 6. How to ask Claude for help
232
+
233
+ When using Claude Code on this repo, prefer **concrete** and **scoped** requests. Some useful patterns:
234
+
235
+ - "Open `examples/simple_plane_wave/simple_plane_wave.py` and explain, in comments, how the grid, medium, and source are defined. Do not change any logic."
236
+ - "I want to add a new example of a focused linear array in 3D with a heterogeneous abdominal wall. Starting from `examples/wave_3d/simple_plane_wave_3d.py`, propose the minimal modifications and file structure, then implement them."
237
+ - "Given the coordinate convention (x=depth, y=lateral, z=elevational) and C‑array indexing, help me write a helper function that converts a physical coordinate (x_mm, y_mm, z_mm) into an index triple compatible with the solver."
238
+ - "I'm running out of GPU memory in a 3D example. Suggest code changes (grid size, time steps, number of GPUs) that reduce memory usage but preserve physical fidelity as much as possible."
239
+ - "Help refactor the medium builder so that it can load a 3D segmentation mask and assign per‑label attenuation parameters (\(\alpha_0\), \(\gamma\))."
240
+
241
+ When you ask Claude to modify code:
242
+
243
+ - Specify the target file(s) and functions.
244
+ - State clearly whether public APIs may change.
245
+ - Ask for minimal, well‑documented diffs.
246
+
247
+ ---
248
+
249
+ ## 7. Coding guidelines and constraints
250
+
251
+ - **Numerical correctness first**: Do not change discretization, CFL conditions, or attenuation formulations without explicit intent and justification.
252
+ - **Performance aware**:
253
+ - Avoid Python loops in inner loops; push heavy work into vectorized operations or existing CUDA kernels.
254
+ - Be careful with host–device copies; they are often the bottleneck.
255
+ - **API design**:
256
+ - Favor explicit, keyword‑driven configuration over "magic" defaults, especially for physical parameters (e.g., attenuation, relaxation parameters).
257
+ - Maintain backward compatibility for documented examples where possible.
258
+
259
+ ---
260
+
261
+ ## 8. Things Claude should NOT do
262
+
263
+ - Do not:
264
+ - Rewrite numerical schemes unless explicitly requested and scoped.
265
+ - Change coordinate conventions or index ordering.
266
+ - Introduce breaking changes to the Python API without a clear migration path.
267
+ - Add heavy dependencies just for convenience (especially in the core library).
268
+ - you don't need to run a test. Ask user to run the test.
269
+
270
+ - Be cautious when:
271
+ - Changing I/O formats or directory structures that examples depend on.
272
+ - Touching anything related to the attenuation model or relaxation parameters.
273
+
274
+ ---
275
+
276
+ ## 9. Quick mental model
277
+
278
+ You can think of `fullwave25` as:
279
+
280
+ > "A Python‑driven, CUDA‑accelerated FDTD ultrasound simulator that handles realistic, heterogeneous attenuation for 2D/3D wave propagation, with examples mirroring k‑Wave‑style workflows."
281
+
282
+ All code changes and suggestions should support this purpose: **high‑fidelity ultrasound simulations that remain practical and usable for researchers.**
283
+
284
+ ## 10. coding style
285
+
286
+ follow ruff.toml