fullwave25 1.4.3.dev0__tar.gz → 1.5.0.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 (423) hide show
  1. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/.bumpversion.toml +15 -2
  2. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/.gitignore +1 -0
  3. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/PKG-INFO +4 -4
  4. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/README.md +3 -3
  5. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/fullwave/__init__.py +1 -1
  6. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/fullwave/medium.py +35 -14
  7. fullwave25-1.5.0.dev0/fullwave/solver/bins/database/relaxation_params_database_num_relax=4_20261102_1540.mat +0 -0
  8. fullwave25-1.5.0.dev0/fullwave/solver/bins/database/relaxation_params_database_num_relax=4_20261102_1540_invalid_cells.json +4096 -0
  9. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/fullwave/solver/shipped_database.py +1 -1
  10. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/fullwave/utils/relaxation_parameters.py +193 -21
  11. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/pyproject.toml +1 -1
  12. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/uv.lock +1 -1
  13. fullwave25-1.4.3.dev0/.claude/.gitignore +0 -1
  14. fullwave25-1.4.3.dev0/.claude/20260911_1813_dead-code.md +0 -162
  15. fullwave25-1.4.3.dev0/.claude/20260916_1311_commit_message_of_the_input_generation_speedup.md +0 -13
  16. fullwave25-1.4.3.dev0/.claude/20260916_1311_pull_request_of_the_input_generation_speedup.md +0 -31
  17. fullwave25-1.4.3.dev0/.claude/20260916_1405_commit_message_of_the_relaxation_memory_estimate.md +0 -10
  18. fullwave25-1.4.3.dev0/.claude/20260916_1405_pull_request_of_the_relaxation_memory_estimate.md +0 -24
  19. fullwave25-1.4.3.dev0/.claude/20260916_2152_commit_message_of_the_cuda_version_choice.md +0 -10
  20. fullwave25-1.4.3.dev0/.claude/20260916_2152_pull_request_of_the_cuda_version_choice.md +0 -25
  21. fullwave25-1.4.3.dev0/.claude/20260916_2203_commit_message_of_the_cuda_version_tests.md +0 -10
  22. fullwave25-1.4.3.dev0/.claude/20260916_2213_commit_message_of_the_blackwell_version_choice.md +0 -9
  23. fullwave25-1.4.3.dev0/.claude/20260916_2213_pull_request_of_the_blackwell_version_choice.md +0 -23
  24. fullwave25-1.4.3.dev0/.claude/CLAUDE.md +0 -286
  25. fullwave25-1.4.3.dev0/.claude/matrix_imaging/20260909_1844_acquire_the_reflection_matrix.py +0 -55
  26. fullwave25-1.4.3.dev0/.claude/matrix_imaging/20260909_1900_test_on_a_synthetic_acquisition.py +0 -139
  27. fullwave25-1.4.3.dev0/.claude/matrix_imaging/20260909_1913_analyze_the_reflection_matrix.py +0 -111
  28. fullwave25-1.4.3.dev0/.claude/matrix_imaging/20260909_2107_redraw_the_figures_of_an_analysis.py +0 -48
  29. fullwave25-1.4.3.dev0/.claude/matrix_imaging/20260909_2121_write_the_result_tables.py +0 -177
  30. fullwave25-1.4.3.dev0/.claude/matrix_imaging/20260910_1126_synthesize_plane_waves_from_the_multistatic_matrix.py +0 -132
  31. fullwave25-1.4.3.dev0/.claude/matrix_imaging/20260910_1137_scan_the_speed_of_sound.py +0 -531
  32. fullwave25-1.4.3.dev0/.claude/matrix_imaging/20260910_1141_compare_the_laws_with_the_truth.py +0 -490
  33. fullwave25-1.4.3.dev0/.claude/matrix_imaging/20260910_1146_evaluate_the_reverberation_filter.py +0 -525
  34. fullwave25-1.4.3.dev0/.claude/matrix_imaging/20260910_1208_compare_plane_waves_with_the_synthesis.py +0 -143
  35. fullwave25-1.4.3.dev0/.claude/matrix_imaging/figures.py +0 -521
  36. fullwave25-1.4.3.dev0/.claude/matrix_imaging/ground_truth.py +0 -394
  37. fullwave25-1.4.3.dev0/.claude/matrix_imaging/matrix_imaging.py +0 -1346
  38. fullwave25-1.4.3.dev0/.claude/matrix_imaging/pipeline.py +0 -534
  39. fullwave25-1.4.3.dev0/.claude/matrix_imaging/reflection_matrix.py +0 -370
  40. fullwave25-1.4.3.dev0/.claude/matrix_imaging/speed_of_sound.py +0 -417
  41. fullwave25-1.4.3.dev0/.claude/matrix_imaging/synthetic.py +0 -166
  42. fullwave25-1.4.3.dev0/.claude/scratch/20260821_0206_band_anchor_cross_check.py +0 -137
  43. fullwave25-1.4.3.dev0/.claude/scratch/20260821_0233_delivered_power_law_end_to_end.py +0 -125
  44. fullwave25-1.4.3.dev0/.claude/scratch/20260821_0317_reword_deliver_in_the_library.py +0 -59
  45. fullwave25-1.4.3.dev0/.claude/scratch/20260821_1220_relaxation_low_frequency_rolloff.py +0 -246
  46. fullwave25-1.4.3.dev0/.claude/scratch/20260825_1937_what_fails_the_pml_golden_tests.py +0 -103
  47. fullwave25-1.4.3.dev0/.claude/scratch/20260825_2329_does_the_wrapper_read_the_record.py +0 -112
  48. fullwave25-1.4.3.dev0/.claude/scratch/20260826_0002_what_the_new_default_table_holds.py +0 -92
  49. fullwave25-1.4.3.dev0/.claude/scratch/20260828_1422_what_the_candidate_tables_hold.py +0 -101
  50. fullwave25-1.4.3.dev0/.claude/scratch/20260828_1427_what_the_deployment_needs.py +0 -249
  51. fullwave25-1.4.3.dev0/.claude/scratch/20260828_1510_where_the_unstretched_ramp_reaches.py +0 -218
  52. fullwave25-1.4.3.dev0/.claude/scratch/20260828_1517_the_blast_radius_of_the_ramp.py +0 -237
  53. fullwave25-1.4.3.dev0/.claude/scratch/20260830_1458_the_3d_region_trimmed_kernel_against_the_reference.py +0 -196
  54. fullwave25-1.4.3.dev0/.claude/scratch/20260830_1505_the_multi_node_kernel_against_the_multi_gpu_one.py +0 -179
  55. fullwave25-1.4.3.dev0/.claude/scratch/20260830_1631_the_3d_multi_node_against_the_multi_gpu_one.py +0 -119
  56. fullwave25-1.4.3.dev0/.claude/scratch/20260830_1642_the_selective_absorbing_layer.py +0 -176
  57. fullwave25-1.4.3.dev0/.claude/scratch/20260830_1728_the_layer_against_the_taper.py +0 -312
  58. fullwave25-1.4.3.dev0/.claude/scratch/20260830_1757_what_the_margin_outside_the_layer_does.py +0 -286
  59. fullwave25-1.4.3.dev0/.claude/scratch/20260830_1808_the_layer_in_3d_and_on_the_multi_node_builds.py +0 -446
  60. fullwave25-1.4.3.dev0/.claude/scratch/20260830_1832_where_the_3d_residual_sits.py +0 -324
  61. fullwave25-1.4.3.dev0/.claude/scratch/20260830_1837_inside_the_layer_at_the_corner.py +0 -294
  62. fullwave25-1.4.3.dev0/.claude/scratch/20260830_1840_inside_the_3d_layer_at_the_corner.py +0 -292
  63. fullwave25-1.4.3.dev0/.claude/scratch/20260830_1912_both_absorbers_on_one_method.py +0 -326
  64. fullwave25-1.4.3.dev0/.claude/scratch/20260830_1922_the_layer_on_the_reflection_method.py +0 -443
  65. fullwave25-1.4.3.dev0/.claude/scratch/20260830_2011_whole_domain_animation.py +0 -327
  66. fullwave25-1.4.3.dev0/.claude/scratch/20260830_2032_the_example_source_kind.py +0 -168
  67. fullwave25-1.4.3.dev0/.claude/scratch/20260830_2148_drive_scale_of_the_strong_beta_cells.py +0 -71
  68. fullwave25-1.4.3.dev0/.claude/scratch/20260830_2159_profile_the_input_map_build.py +0 -250
  69. fullwave25-1.4.3.dev0/.claude/scratch/20260830_2201_build_then_extend_equivalence.py +0 -201
  70. fullwave25-1.4.3.dev0/.claude/scratch/20260830_2304_the_transmit_methods_launch_what_they_say.py +0 -208
  71. fullwave25-1.4.3.dev0/.claude/scratch/20260830_2322_the_unscaled_added_drive_follows_the_courant_number.py +0 -239
  72. fullwave25-1.4.3.dev0/.claude/scratch/20260831_0033_the_three_dimensional_arrays.py +0 -249
  73. fullwave25-1.4.3.dev0/.claude/scratch/20260831_0054_the_elevation_lens_of_a_linear_array.py +0 -276
  74. fullwave25-1.4.3.dev0/.claude/scratch/20260831_0115_run_every_example.sh +0 -21
  75. fullwave25-1.4.3.dev0/.claude/scratch/20260831_0124_move_the_notebooks_to_the_transmit_interface.py +0 -274
  76. fullwave25-1.4.3.dev0/.claude/scratch/20260831_0137_the_air_region_at_four_mechanisms.py +0 -314
  77. fullwave25-1.4.3.dev0/.claude/scratch/20260831_0148_the_element_records_its_own_transmit.py +0 -202
  78. fullwave25-1.4.3.dev0/.claude/scratch/20260831_0150_the_absorbing_layer_of_a_point_source.py +0 -235
  79. fullwave25-1.4.3.dev0/.claude/scratch/20260831_0152_the_exponential_absorbing_layer_against_its_thickness.py +0 -213
  80. fullwave25-1.4.3.dev0/.claude/scratch/20260831_0202_the_rebuilt_exponential_absorbing_layer.py +0 -267
  81. fullwave25-1.4.3.dev0/.claude/scratch/20260831_0216_where_the_three_dimensional_layer_leaks.py +0 -258
  82. fullwave25-1.4.3.dev0/.claude/scratch/20260831_0222_the_absorbing_layer_away_from_the_source.py +0 -266
  83. fullwave25-1.4.3.dev0/.claude/scratch/20260831_1037_where_the_near_field_brightness_comes_from.py +0 -276
  84. fullwave25-1.4.3.dev0/.claude/scratch/20260831_1040_the_aperture_transit_wedge_in_the_channel_data.py +0 -296
  85. fullwave25-1.4.3.dev0/.claude/scratch/20260831_1043_the_transmit_in_the_recorded_trace_and_its_removal.py +0 -460
  86. fullwave25-1.4.3.dev0/.claude/scratch/20260831_1048_the_receive_row_against_the_reference_subtraction.py +0 -491
  87. fullwave25-1.4.3.dev0/.claude/scratch/20260831_1052_the_backing_behind_the_array_face.py +0 -495
  88. fullwave25-1.4.3.dev0/.claude/scratch/20260831_1056_the_transmit_beam_with_the_air_backing.py +0 -233
  89. fullwave25-1.4.3.dev0/.claude/scratch/20260831_1105_the_shipped_transducer_stack_in_the_solver.py +0 -485
  90. fullwave25-1.4.3.dev0/.claude/scratch/20260831_1119_where_the_stack_puts_the_source_and_what_it_costs_the_depth.py +0 -446
  91. fullwave25-1.4.3.dev0/.claude/scratch/20260831_1121_the_depth_the_image_reads_with_the_stack.py +0 -451
  92. fullwave25-1.4.3.dev0/.claude/scratch/20260831_1123_the_depth_the_beamformer_puts_one_point_at.py +0 -353
  93. fullwave25-1.4.3.dev0/.claude/scratch/20260831_1142_the_transmit_offset_the_beamformer_needs.py +0 -367
  94. fullwave25-1.4.3.dev0/.claude/scratch/20260831_1145_the_depth_shift_the_offset_fix_makes.py +0 -183
  95. fullwave25-1.4.3.dev0/.claude/scratch/20260831_1154_the_two_offset_rules_on_the_same_recording.py +0 -231
  96. fullwave25-1.4.3.dev0/.claude/scratch/20260831_1212_what_the_pinned_release_carries.py +0 -141
  97. fullwave25-1.4.3.dev0/.claude/scratch/20260831_1228_the_low_cut_against_the_near_field_haze.py +0 -490
  98. fullwave25-1.4.3.dev0/.claude/scratch/20260831_1301_run_the_beamforming_notebooks.py +0 -50
  99. fullwave25-1.4.3.dev0/.claude/scratch/20260831_1432_point_dataset_generator_at_the_local_fullwave.py +0 -92
  100. fullwave25-1.4.3.dev0/.claude/scratch/20260831_1437_the_aperture_width_the_reference_geometry_reports.py +0 -79
  101. fullwave25-1.4.3.dev0/.claude/scratch/20260831_1454_calibrate_the_ats539_plane_wave.py +0 -367
  102. fullwave25-1.4.3.dev0/.claude/scratch/20260831_1508_show_the_b_mode_in_the_hdf5.py +0 -315
  103. fullwave25-1.4.3.dev0/.claude/scratch/20260831_1534_the_comet_behind_each_wire.py +0 -241
  104. fullwave25-1.4.3.dev0/.claude/scratch/20260831_1547_read_the_calibration_trials.py +0 -226
  105. fullwave25-1.4.3.dev0/.claude/scratch/20260831_1605_what_the_medium_holds_in_the_near_field.py +0 -195
  106. fullwave25-1.4.3.dev0/.claude/scratch/20260831_1607_sweep_one_generator_knob.py +0 -322
  107. fullwave25-1.4.3.dev0/.claude/scratch/20260831_1715_assert_the_ats539_rate_chain.py +0 -166
  108. fullwave25-1.4.3.dev0/.claude/scratch/20260831_1717_measure_every_layer_of_the_stack.py +0 -151
  109. fullwave25-1.4.3.dev0/.claude/scratch/20260831_1720_where_the_trailing_energy_lands.py +0 -201
  110. fullwave25-1.4.3.dev0/.claude/scratch/20260831_1725_offer_the_requested_absorption_to_the_backing.py +0 -119
  111. fullwave25-1.4.3.dev0/.claude/scratch/20260831_1727_let_a_sweep_carry_a_switch.py +0 -105
  112. fullwave25-1.4.3.dev0/.claude/scratch/20260831_1731_expose_the_exponential_absorbing_layer.py +0 -121
  113. fullwave25-1.4.3.dev0/.claude/scratch/20260831_1746_point_the_solver_at_an_older_binary.py +0 -95
  114. fullwave25-1.4.3.dev0/.claude/scratch/20260831_1756_measure_the_point_targets.py +0 -154
  115. fullwave25-1.4.3.dev0/.claude/scratch/20260831_1802_rederive_the_near_field_bounce.py +0 -106
  116. fullwave25-1.4.3.dev0/.claude/scratch/20260831_1810_does_the_shelf_move_with_depth.py +0 -199
  117. fullwave25-1.4.3.dev0/.claude/scratch/20260831_1812_find_the_repeat_delay_in_the_raw_rf.py +0 -168
  118. fullwave25-1.4.3.dev0/.claude/scratch/20260831_1937_give_each_source_row_its_own_launch_delay.py +0 -88
  119. fullwave25-1.4.3.dev0/.claude/scratch/20260831_1943_baffle_the_element_plane.py +0 -103
  120. fullwave25-1.4.3.dev0/.claude/scratch/20260831_1952_take_the_cell_size_from_the_grid.py +0 -70
  121. fullwave25-1.4.3.dev0/.claude/scratch/20260831_2058_run_the_ats539_through_the_batched_solver.py +0 -120
  122. fullwave25-1.4.3.dev0/.claude/scratch/20260831_2105_queue_the_remaining_candidates.py +0 -143
  123. fullwave25-1.4.3.dev0/.claude/scratch/20260831_2122_the_simulator_asks_for_a_clamped_source.py +0 -111
  124. fullwave25-1.4.3.dev0/.claude/scratch/20260831_2126_rename_the_source_types_to_hard_and_soft.py +0 -98
  125. fullwave25-1.4.3.dev0/.claude/scratch/20260831_2140_bind_the_source_type_to_its_entrance.py +0 -224
  126. fullwave25-1.4.3.dev0/.claude/scratch/20260831_2225_how_redundant_are_the_absorbing_layer_files.py +0 -166
  127. fullwave25-1.4.3.dev0/.claude/scratch/20260831_2239_skip_the_constant_absorbing_layer_maps.py +0 -171
  128. fullwave25-1.4.3.dev0/.claude/scratch/20260831_2246_count_the_files_a_run_writes.py +0 -144
  129. fullwave25-1.4.3.dev0/.claude/scratch/20260831_2352_run_the_map_tiers_end_to_end.py +0 -243
  130. fullwave25-1.4.3.dev0/.claude/scratch/20260831_2355_draw_the_absorbing_layer_map_cost.py +0 -170
  131. fullwave25-1.4.3.dev0/.claude/scratch/20260901_1502_can_the_transmit_reach_the_harmonic_band.py +0 -173
  132. fullwave25-1.4.3.dev0/.claude/scratch/20260901_1504_contrast_harmonic_imaging.py +0 -896
  133. fullwave25-1.4.3.dev0/.claude/scratch/20260901_1507_where_each_band_puts_its_largest_sample.py +0 -139
  134. fullwave25-1.4.3.dev0/.claude/scratch/20260901_1519_is_the_harmonic_tail_cumulative.py +0 -280
  135. fullwave25-1.4.3.dev0/.claude/scratch/20260901_1537_does_the_cancellation_work.py +0 -202
  136. fullwave25-1.4.3.dev0/.claude/scratch/20260901_1612_does_a_sparse_bubble_cloud_localize.py +0 -232
  137. fullwave25-1.4.3.dev0/.claude/scratch/20260901_1619_calibrate_the_bubble_scatter_range.py +0 -310
  138. fullwave25-1.4.3.dev0/.claude/scratch/20260901_1622_draw_the_sweep_b_modes.py +0 -168
  139. fullwave25-1.4.3.dev0/.claude/scratch/20260901_1654_where_the_bright_region_sits.py +0 -367
  140. fullwave25-1.4.3.dev0/.claude/scratch/20260901_1701_where_one_bubble_images.py +0 -301
  141. fullwave25-1.4.3.dev0/.claude/scratch/20260901_1702_does_the_portable_example_reproduce_the_evaluation.py +0 -115
  142. fullwave25-1.4.3.dev0/.claude/scratch/20260901_1753_does_the_ported_solver_still_march_the_same.py +0 -212
  143. fullwave25-1.4.3.dev0/.claude/scratch/20260901_1755_do_the_ranks_agree_on_the_bubbles.py +0 -385
  144. fullwave25-1.4.3.dev0/.claude/scratch/20260901_1817_does_the_air_region_reach_every_solver.py +0 -331
  145. fullwave25-1.4.3.dev0/.claude/scratch/20260901_1818_does_the_air_region_reach_every_rank.py +0 -285
  146. fullwave25-1.4.3.dev0/.claude/scratch/20260902_1317_what_the_abdomen_volume_holds.py +0 -129
  147. fullwave25-1.4.3.dev0/.claude/scratch/20260902_1319_art_wave_in_the_abdomen.py +0 -584
  148. fullwave25-1.4.3.dev0/.claude/scratch/20260902_1324_art_figures_from_the_field.py +0 -2176
  149. fullwave25-1.4.3.dev0/.claude/scratch/20260902_1744_art_final_animations.py +0 -266
  150. fullwave25-1.4.3.dev0/.claude/scratch/20260904_1216_art_wire_visibility.py +0 -426
  151. fullwave25-1.4.3.dev0/.claude/scratch/20260904_2327_b_mode_of_the_abdomen.py +0 -1494
  152. fullwave25-1.4.3.dev0/.claude/scratch/20260905_0038_two_against_three_dimensions.py +0 -529
  153. fullwave25-1.4.3.dev0/.claude/scratch/20260909_1934_probe_the_reverberation_filter_on_speckle.py +0 -93
  154. fullwave25-1.4.3.dev0/.claude/scratch/20260909_1939_probe_the_ideal_profile_on_speckle.py +0 -86
  155. fullwave25-1.4.3.dev0/.claude/scratch/20260909_2044_probe_the_correction_bases_on_a_flat_speckle.py +0 -59
  156. fullwave25-1.4.3.dev0/.claude/scratch/20260909_2342_measure_the_wall_delay_screen.py +0 -85
  157. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1134_find_the_first_non_finite_value_of_the_plane_wave_correction.py +0 -98
  158. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1234_print_the_summaries_of_analyses.py +0 -100
  159. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/a_maps_checks.py +0 -75
  160. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/b_effective_frequency.py +0 -55
  161. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/c_composed_steps.py +0 -46
  162. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/check_element_centers.py +0 -77
  163. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/check_plane_wave_law.py +0 -248
  164. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/d2_gate_quarter_period.py +0 -52
  165. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/d_gate_cases.py +0 -52
  166. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/e_plate_crash.py +0 -63
  167. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/f_patch_grid.py +0 -17
  168. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/g_frequency_scan.py +0 -29
  169. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/gouy_check.py +0 -87
  170. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/h_pulse_and_wires.py +0 -23
  171. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/i_phase_slope.py +0 -28
  172. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_2a8c46c5-7d0_a0200910_001.sh +0 -1
  173. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_2a8c46c5-7d0_a0200910_002.sh +0 -6
  174. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_2a8c46c5-7d0_a0200910_003.sh +0 -5
  175. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_2a8c46c5-7d0_a0200910_004.sh +0 -10
  176. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_2a8c46c5-7d0_a0200910_005.sh +0 -8
  177. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_2a8c46c5-7d0_a16f7afd_001.sh +0 -6
  178. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_2a8c46c5-7d0_a16f7afd_002.sh +0 -13
  179. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_2a8c46c5-7d0_a16f7afd_003.sh +0 -12
  180. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_2a8c46c5-7d0_a16f7afd_004.sh +0 -9
  181. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_2a8c46c5-7d0_a16f7afd_005.sh +0 -13
  182. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_2a8c46c5-7d0_a16f7afd_006.sh +0 -13
  183. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_2a8c46c5-7d0_a16f7afd_007.sh +0 -16
  184. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_2a8c46c5-7d0_a16f7afd_008.sh +0 -10
  185. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_2a8c46c5-7d0_a16f7afd_009.sh +0 -34
  186. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_2a8c46c5-7d0_a16f7afd_010.sh +0 -39
  187. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_2a8c46c5-7d0_a3e03828_001.sh +0 -14
  188. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_2a8c46c5-7d0_a3e03828_002.sh +0 -10
  189. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_2a8c46c5-7d0_a3e03828_003.sh +0 -10
  190. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_2a8c46c5-7d0_a3e03828_004.sh +0 -8
  191. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_2a8c46c5-7d0_a3e03828_005.sh +0 -9
  192. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_2a8c46c5-7d0_a86c0b02_001.sh +0 -1
  193. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_2a8c46c5-7d0_a86c0b02_002.sh +0 -9
  194. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_2a8c46c5-7d0_a86c0b02_003.sh +0 -7
  195. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_2a8c46c5-7d0_a86c0b02_004.sh +0 -13
  196. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_2a8c46c5-7d0_a86c0b02_005.sh +0 -14
  197. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_2a8c46c5-7d0_a86c0b02_006.sh +0 -2
  198. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_2a8c46c5-7d0_a86c0b02_007.sh +0 -39
  199. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_2a8c46c5-7d0_a86c0b02_008.sh +0 -12
  200. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_47c5d913-2f0_a86c7568_001.sh +0 -10
  201. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a09af998_001.sh +0 -10
  202. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a09af998_002.sh +0 -20
  203. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a09af998_003.sh +0 -18
  204. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a09af998_004.sh +0 -24
  205. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a09af998_005.sh +0 -36
  206. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a09af998_006.sh +0 -18
  207. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a09af998_007.sh +0 -50
  208. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a09af998_008.sh +0 -32
  209. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a09af998_009.sh +0 -7
  210. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a3c684a5_001.sh +0 -1
  211. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a3c684a5_002.sh +0 -23
  212. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a3c684a5_003.sh +0 -6
  213. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a3c684a5_004.sh +0 -8
  214. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a3c684a5_005.sh +0 -1
  215. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a3c684a5_006.sh +0 -7
  216. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a3c684a5_007.sh +0 -12
  217. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a99b1764_001.sh +0 -1
  218. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a99b1764_002.sh +0 -9
  219. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a99b1764_003.sh +0 -17
  220. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a99b1764_004.sh +0 -16
  221. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a99b1764_005.sh +0 -6
  222. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a99b1764_006.sh +0 -13
  223. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a99b1764_007.sh +0 -8
  224. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a99b1764_008.sh +0 -13
  225. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a99b1764_009.sh +0 -11
  226. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a99b1764_010.sh +0 -19
  227. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a99b1764_011.sh +0 -16
  228. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a99b1764_012.sh +0 -19
  229. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a99b1764_013.sh +0 -17
  230. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a99b1764_014.sh +0 -7
  231. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a99b1764_015.sh +0 -6
  232. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/inline_commands/wf_714887dd-b46_a99b1764_016.sh +0 -20
  233. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/instrumented_guard_run.py +0 -108
  234. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/instrumented_plane_wave_nan.py +0 -71
  235. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/j_wires_in_wall.py +0 -27
  236. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/origin_checks.py +0 -76
  237. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/origin_das.py +0 -95
  238. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/quick_checks.py +0 -52
  239. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/scan_checks.py +0 -140
  240. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/scan_checks_2.py +0 -133
  241. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/scan_checks_3.py +0 -110
  242. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/scan_checks_4.py +0 -74
  243. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1239_matrix_imaging_agent_checks/toy_plane_wave.py +0 -161
  244. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1241_check_that_the_records_load.py +0 -58
  245. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1241_locate_the_non_finite_values_of_an_analysis.py +0 -43
  246. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1241_measure_the_wire_depth_against_the_time_origin.py +0 -61
  247. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1241_print_the_time_origin_scans.py +0 -48
  248. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1241_test_the_entropy_the_antisymmetry_and_the_filter_linearity.py +0 -88
  249. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1247_time_the_phase_reversal_per_patch_against_batched.py +0 -92
  250. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1248_compare_the_synthesis_on_the_card_and_the_host.py +0 -61
  251. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1250_save_and_compare_the_local_laws_of_a_subset.py +0 -113
  252. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1254_analyze_the_2.5mhz_stage_2.sh +0 -58
  253. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1256_print_the_per_depth_curves_of_a_reverberation_test.py +0 -48
  254. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1302_print_the_durations_of_a_chain_log.py +0 -43
  255. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1314_print_the_gouy_points_of_a_speed_of_sound_scan.py +0 -49
  256. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1445_fit_the_moveout_speed_of_the_point_sources.py +0 -307
  257. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1456_fit_the_depth_offset_of_the_reference_arrivals.py +0 -224
  258. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1502_print_the_laws_and_gates_of_an_analysis.py +0 -56
  259. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1503_analyze_with_the_ramp_removal_off_or_every_law_one.py +0 -144
  260. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1504_measure_the_anti_diagonal_share_of_the_clean_clutter.py +0 -203
  261. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1508_estimate_the_speed_with_smaller_windows.py +0 -138
  262. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1553_focus_the_clutter_records_in_sub_bands.py +0 -142
  263. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1553_print_the_band_and_the_screens_of_the_records.py +0 -87
  264. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1554_predict_the_phase_speed_of_the_stencil.py +0 -168
  265. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1556_compute_the_moveout_truth_with_an_eikonal_solver.py +0 -502
  266. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1556_fit_the_height_offset_on_three_grids.py +0 -252
  267. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1600_measure_the_flat_and_the_screen_correction_on_point_targets.py +0 -490
  268. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1604_predict_the_arrivals_from_the_stencil.py +0 -236
  269. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1604_prototype_the_broadband_correction.py +0 -508
  270. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1605_scan_the_time_origin_with_other_element_planes.py +0 -198
  271. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1607_measure_the_local_far_field_structure_of_the_clutter.py +0 -393
  272. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1608_score_the_speed_scans_against_the_eikonal_truth.py +0 -245
  273. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1610_compare_the_unwrapped_law_delays_with_the_truth.py +0 -186
  274. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1611_compare_the_arrival_models_at_the_point_sources.py +0 -364
  275. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1613_compare_the_sensor_pixel_with_the_element_center.py +0 -117
  276. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1613_measure_the_order_of_the_clutter_from_the_contrast_scaling.py +0 -365
  277. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1613_scan_the_speed_of_sound_at_one_time_origin.py +0 -167
  278. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1615_locate_the_source_and_sensor_pixels_of_the_array.py +0 -167
  279. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1617_check_the_data_level_correction_and_the_pulse_band.py +0 -340
  280. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1617_test_local_and_notch_filters_on_the_clutter.py +0 -388
  281. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1621_compute_the_moveout_truth_with_a_chosen_arrival_model.py +0 -304
  282. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1622_measure_the_tilt_spread_of_the_wall_interfaces.py +0 -235
  283. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1623_tabulate_the_broadband_correction_runs.py +0 -135
  284. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1626_measure_the_ghost_depths_of_the_plate.py +0 -134
  285. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1626_score_the_product_of_the_transducer_laws.py +0 -150
  286. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1630_test_the_local_filter_with_padded_windows.py +0 -127
  287. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1632_fit_the_time_origin_and_the_speed_of_the_phantom_scans.py +0 -170
  288. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1634_fit_the_reference_speed_at_the_sensor_row.py +0 -106
  289. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1646_split_the_clutter_into_orders_and_predict_its_floor.py +0 -248
  290. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1652_tabulate_the_pulse_band_check.py +0 -42
  291. fullwave25-1.4.3.dev0/.claude/scratch/20260910_1659_check_the_plane_wave_transform_of_the_elements.py +0 -69
  292. fullwave25-1.4.3.dev0/.claude/scratch/20260916_1103_compare_two_b_mode_roots.py +0 -38
  293. fullwave25-1.4.3.dev0/.claude/scratch/20260916_1214_binary_cache_lookup_order.py +0 -86
  294. fullwave25-1.4.3.dev0/.claude/scratch/20260916_1253_signal_of_old_against_new.py +0 -74
  295. fullwave25-1.4.3.dev0/.claude/scratch/20260916_1300_read_the_numexpr_pool_limit.py +0 -18
  296. fullwave25-1.4.3.dev0/.claude/scratch/20260916_1332_gpu_memory_of_the_relaxation_kernel.py +0 -72
  297. fullwave25-1.4.3.dev0/.claude/scratch/20260916_1401_relaxation_regions_against_the_kernel.py +0 -65
  298. fullwave25-1.4.3.dev0/.claude/scratch/20260916_1420_released_binary_carries_the_fix.py +0 -37
  299. fullwave25-1.4.3.dev0/.claude/scratch/20260916_1601_stable_courant_number_of_the_stencil_table.py +0 -199
  300. fullwave25-1.4.3.dev0/.claude/scratch/20260916_1602_fast_layer_in_a_small_3d_run.py +0 -162
  301. fullwave25-1.4.3.dev0/.claude/scratch/20260916_1719_p4_1_pulse_energy_above_the_trace_nyquist.py +0 -58
  302. fullwave25-1.4.3.dev0/.claude/scratch/20260916_1933_l7_4_run_at_8_ppw_stability_and_trace_sampling.py +0 -73
  303. fullwave25-1.4.3.dev0/.claude/scratch/20260916_1946_l7_4_trace_sampling_by_field_modulus.py +0 -70
  304. fullwave25-1.4.3.dev0/.claude/scratch/20260916_2004_pulse_bands_of_the_two_abdomen_arrays.py +0 -79
  305. fullwave25-1.4.3.dev0/.claude/scratch/20260916_2155_cuda_version_choice_before_and_after.py +0 -90
  306. fullwave25-1.4.3.dev0/.claude/scratch/20260916_2155_gpu_architectures_in_cached_binaries.py +0 -64
  307. fullwave25-1.4.3.dev0/.claude/scratch/20260916_2155_mutation_check_of_the_cuda_version_tests.py +0 -82
  308. fullwave25-1.4.3.dev0/.claude/scratch/20260916_2155_verify_the_cuda_version_test_findings.py +0 -89
  309. fullwave25-1.4.3.dev0/.claude/scratch/20260916_2212_mutation_check_of_the_blackwell_version_choice.py +0 -111
  310. fullwave25-1.4.3.dev0/.claude/scratch/20260925_1321_selected_cuda_tag.py +0 -7
  311. fullwave25-1.4.3.dev0/.claude/scratch/20260925_1326_release_binary_bit_identity.py +0 -459
  312. fullwave25-1.4.3.dev0/.claude/scratch/20260925_1331_summarize_release_check.py +0 -18
  313. fullwave25-1.4.3.dev0/.claude/settings.local.json +0 -20
  314. fullwave25-1.4.3.dev0/.claude/three_dimensional/convex_transducer_3d.py +0 -127
  315. fullwave25-1.4.3.dev0/.claude/three_dimensional/linear_transducer_3d.py +0 -140
  316. fullwave25-1.4.3.dev0/.claude/three_dimensional/matrix_transducer_3d.py +0 -135
  317. fullwave25-1.4.3.dev0/.claude/three_dimensional/patch.py +0 -523
  318. fullwave25-1.4.3.dev0/.claude/three_dimensional/ruff.toml +0 -40
  319. fullwave25-1.4.3.dev0/.claude/three_dimensional/superseded/convex_transducer_3d.py +0 -126
  320. fullwave25-1.4.3.dev0/.claude/three_dimensional/superseded/linear_transducer_3d.py +0 -138
  321. fullwave25-1.4.3.dev0/.claude/three_dimensional/superseded/matrix_transducer_3d.py +0 -134
  322. fullwave25-1.4.3.dev0/.claude/three_dimensional/test_patch.py +0 -178
  323. fullwave25-1.4.3.dev0/.claude/transducer_stack/README.md +0 -70
  324. fullwave25-1.4.3.dev0/.claude/transducer_stack/superseded/full_synthetic_aperture_with_stack.py +0 -438
  325. fullwave25-1.4.3.dev0/.claude/transducer_stack/superseded/plane_wave_compounding_with_stack.py +0 -433
  326. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/.pre-commit-config.yaml +0 -0
  327. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/.python-version +0 -0
  328. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/20260120_0844.log +0 -0
  329. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/CITATION.cff +0 -0
  330. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/CONTRIBUTING.md +0 -0
  331. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/LICENSE +0 -0
  332. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/Makefile +0 -0
  333. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/attenuation.png +0 -0
  334. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/beamformer.m +0 -0
  335. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/debug_solver_bin/fullwave2_2d_2_relax_multi_gpu_cuda124 +0 -0
  336. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/debug_solver_bin/fullwave2_2d_exponential_attenuation_multi_gpu +0 -0
  337. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/debug_solver_bin/fullwave2_2d_exponential_attenuation_multi_gpu_cuda124 +0 -0
  338. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/debug_solver_bin/fullwave2_2d_exponential_attenuation_multi_gpu_cuda124_ +0 -0
  339. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/debug_solver_bin/fullwave2_3d_exponential_attenuation_multi_gpu_cuda124 +0 -0
  340. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/debug_solver_bin/fullwave2_3d_exponential_attenuation_multi_gpu_cuda124_ +0 -0
  341. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/docker/Dockerfile +0 -0
  342. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/docker/Dockerfile.dockerignore +0 -0
  343. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/docker/README.md +0 -0
  344. {fullwave25-1.4.3.dev0/.claude/skills → fullwave25-1.5.0.dev0/docs/claude_skill}/fullwave25/SKILL.md +0 -0
  345. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/docs/fullwave2_ultra.md +0 -0
  346. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/experiments/__init__.py +0 -0
  347. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/experiments/exp_scatterer_diameter.py +0 -0
  348. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/fullwave/beamformer/__init__.py +0 -0
  349. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/fullwave/beamformer/beamformer.py +0 -0
  350. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/fullwave/beamformer/mach_beamformer.py +0 -0
  351. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/fullwave/constants/__init__.py +0 -0
  352. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/fullwave/constants/material_properties.py +0 -0
  353. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/fullwave/grid.py +0 -0
  354. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/fullwave/medium_builder/__init__.py +0 -0
  355. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/fullwave/medium_builder/domain.py +0 -0
  356. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/fullwave/medium_builder/medium_builder.py +0 -0
  357. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/fullwave/medium_builder/presets/__init__.py +0 -0
  358. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/fullwave/medium_builder/presets/combined_phantom_map.py +0 -0
  359. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/fullwave/medium_builder/presets/data/.keep +0 -0
  360. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/fullwave/medium_builder/presets/data/abdominal_wall/i2365f_etfw1.mat +0 -0
  361. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/fullwave/medium_builder/presets/domain_abdominal_wall.py +0 -0
  362. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/fullwave/medium_builder/presets/domain_background.py +0 -0
  363. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/fullwave/medium_builder/presets/domain_combined_phantom.py +0 -0
  364. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/fullwave/medium_builder/presets/domain_scatterer.py +0 -0
  365. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/fullwave/medium_builder/presets/domain_simple.py +0 -0
  366. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/fullwave/medium_builder/presets/domain_water_gel.py +0 -0
  367. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/fullwave/sensor.py +0 -0
  368. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/fullwave/solver/__init__.py +0 -0
  369. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/fullwave/solver/binary_manager.py +0 -0
  370. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/fullwave/solver/binary_markers.py +0 -0
  371. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/fullwave/solver/bins/_gpu/2d/num_relax=2/fullwave2_2d_2_relax_multi_gpu_cuda118 +0 -0
  372. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/fullwave/solver/bins/_gpu/2d/num_relax=2/fullwave2_2d_2_relax_multi_gpu_cuda124 +0 -0
  373. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/fullwave/solver/bins/_gpu/2d/num_relax=2/fullwave2_2d_2_relax_multi_gpu_cuda129 +0 -0
  374. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/fullwave/solver/bins/_gpu/2d/num_relax=2/fullwave2_2d_2_relax_multi_gpu_cuda130 +0 -0
  375. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/fullwave/solver/bins/_gpu/3d/num_relax=2/fullwave2_3d_2_relax_multi_gpu_cuda118 +0 -0
  376. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/fullwave/solver/bins/_gpu/3d/num_relax=2/fullwave2_3d_2_relax_multi_gpu_cuda124 +0 -0
  377. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/fullwave/solver/bins/_gpu/3d/num_relax=2/fullwave2_3d_2_relax_multi_gpu_cuda129 +0 -0
  378. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/fullwave/solver/bins/_gpu/3d/num_relax=2/fullwave2_3d_2_relax_multi_gpu_cuda130 +0 -0
  379. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/fullwave/solver/bins/database/relaxation_params_database_num_relax=3_20260828_1513.mat +0 -0
  380. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/fullwave/solver/bins/database/relaxation_params_database_num_relax=3_20260828_1513_invalid_cells.json +0 -0
  381. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/fullwave/solver/bins/database/relaxation_params_database_num_relax=4_20260828_1456.mat +0 -0
  382. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/fullwave/solver/bins/database/relaxation_params_database_num_relax=4_20260828_1456_invalid_cells.json +0 -0
  383. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/fullwave/solver/cuda_utils.py +0 -0
  384. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/fullwave/solver/input_file_writer.py +0 -0
  385. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/fullwave/solver/launcher.py +0 -0
  386. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/fullwave/solver/pml_builder.py +0 -0
  387. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/fullwave/solver/solver.py +0 -0
  388. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/fullwave/solver/source_type.py +0 -0
  389. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/fullwave/solver/utils.py +0 -0
  390. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/fullwave/source.py +0 -0
  391. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/fullwave/transducer.py +0 -0
  392. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/fullwave/transmit.py +0 -0
  393. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/fullwave/ultra/__init__.py +0 -0
  394. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/fullwave/ultra/attenuation_parameters.py +0 -0
  395. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/fullwave/ultra/backend.py +0 -0
  396. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/fullwave/ultra/backend_2d.py +0 -0
  397. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/fullwave/ultra/binary.py +0 -0
  398. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/fullwave/ultra/dat_io.py +0 -0
  399. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/fullwave/ultra/dat_io_3d.py +0 -0
  400. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/fullwave/ultra/errors.py +0 -0
  401. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/fullwave/ultra/factory.py +0 -0
  402. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/fullwave/ultra/medium_to_aexp.py +0 -0
  403. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/fullwave/ultra/stencil.py +0 -0
  404. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/fullwave/ultra/time_axis.py +0 -0
  405. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/fullwave/ultra/writer_2d.py +0 -0
  406. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/fullwave/ultra/writer_3d.py +0 -0
  407. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/fullwave/utils/__init__.py +0 -0
  408. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/fullwave/utils/check_functions.py +0 -0
  409. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/fullwave/utils/coordinates.py +0 -0
  410. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/fullwave/utils/gpu_memory.py +0 -0
  411. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/fullwave/utils/memory_tempfile.py +0 -0
  412. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/fullwave/utils/numerical.py +0 -0
  413. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/fullwave/utils/plot_utils.py +0 -0
  414. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/fullwave/utils/pulse.py +0 -0
  415. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/fullwave/utils/scatterer.py +0 -0
  416. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/fullwave/utils/signal_filter.py +0 -0
  417. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/fullwave/utils/signal_process.py +0 -0
  418. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/logs/20260815_0356_sweep.log +0 -0
  419. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/references/2604.06257v1.pdf +0 -0
  420. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/references/signed.gif +0 -0
  421. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/ruff.log +0 -0
  422. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/ruff.toml +0 -0
  423. {fullwave25-1.4.3.dev0 → fullwave25-1.5.0.dev0}/signal_filter_example.png +0 -0
@@ -1,5 +1,5 @@
1
1
  [tool.bumpversion]
2
- current_version = "1.4.3-dev0"
2
+ current_version = "1.5.0-dev0"
3
3
  parse = """(?x)
4
4
  (?P<major>0|[1-9]\\d*)\\.
5
5
  (?P<minor>0|[1-9]\\d*)\\.
@@ -26,7 +26,7 @@ tag_message = "Bump version: {current_version} → {new_version}"
26
26
 
27
27
  pre_commit_hooks = [
28
28
  "uv lock",
29
- "git add uv.lock .bumpversion.toml fullwave/__init__.py pyproject.toml",
29
+ "git add uv.lock .bumpversion.toml fullwave/__init__.py pyproject.toml examples",
30
30
  ]
31
31
 
32
32
  [[tool.bumpversion.files]]
@@ -41,6 +41,19 @@ filename = "fullwave/__init__.py"
41
41
  search = '__version__ = "{current_version}"'
42
42
  replace = '__version__ = "{new_version}"'
43
43
 
44
+ [[tool.bumpversion.files]]
45
+ # Colab install cell of the example notebooks
46
+ glob = "examples/**/*.ipynb"
47
+ search = 'fullwave25=={current_version}'
48
+ replace = 'fullwave25=={new_version}'
49
+ ignore_missing_version = true
50
+
51
+ [[tool.bumpversion.files]]
52
+ glob = "examples/**/*.ipynb"
53
+ search = 'fullwave25[mach]=={current_version}'
54
+ replace = 'fullwave25[mach]=={new_version}'
55
+ ignore_missing_version = true
56
+
44
57
  [tool.bumpversion.parts.pre_l]
45
58
  values = ["dev", "rc", "final"]
46
59
  optional_value = "final"
@@ -12,3 +12,4 @@ wheels/
12
12
  temp/*
13
13
  outputs
14
14
  .env
15
+ .claude/*
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: fullwave25
3
- Version: 1.4.3-dev0
3
+ Version: 1.5.0-dev0
4
4
  Summary: Fullwave 2.5: Ultrasound wave propagation simulation with heterogeneous power law attenuation modelling capabilities
5
5
  Author: Masashi Sode, Gianmarco Pinton
6
6
  Maintainer: Masashi Sode
@@ -80,7 +80,7 @@ The solver advances the pressure $p$ and the particle velocity $\mathbf{v}$ with
80
80
 
81
81
  $$\nabla_1 p + \rho \cfrac{\partial {\bf{v}}}{\partial t} = 0, \qquad \nabla_2 \cdot {\bf{v}} + \kappa \cfrac{\partial p}{\partial t} = 0 .$$
82
82
 
83
- in which the spatial derivatives $\nabla_1$ and $\nabla_2$ carry a set of relaxation mechanisms. fullwave25 looks up the parameters of these mechanisms in a precomputed table for the $\alpha_0$ and $\gamma$ of each cell, so that the simulated attenuation matches the power law and the phase velocity matches its Kramers-Kronig dispersion. The table spans $\alpha_0$ up to 1.0 dB/(MHz^γ cm) and $\gamma$ from 0.4 to 2.0, for frequencies from 0.1 to 20 MHz.
83
+ in which the spatial derivatives $\nabla_1$ and $\nabla_2$ carry a set of relaxation mechanisms. fullwave25 looks up the parameters of these mechanisms in a precomputed table for the $\alpha_0$ and $\gamma$ of each cell, so that the simulated attenuation matches the power law and the phase velocity matches its Kramers-Kronig dispersion. The table spans $\alpha_0$ up to 1.0 dB/(MHz^γ cm) and $\gamma$ from 0.4 to 2.0, for frequencies from 0.1 to 20 MHz. It extends to $\alpha_0$ = 2.0 dB/(MHz^γ cm) for $\gamma$ from 0.4 to 1.6, and to $\alpha_0$ = 10 dB/(MHz^γ cm) for $\gamma$ = 1.0. A specified pair on a cell the table does not fit logs a warning.
84
84
 
85
85
  The figure compares the target attenuation $\alpha_0 f^\gamma$ (red lines) with the simulated attenuation (black dots) for $\alpha_0 =$ 0.25, 0.5 and 0.75 dB/(MHz^γ cm) and $\gamma =$ 0.4, 0.7, 1.0, 1.3 and 1.6. Each dot is one simulation of a plane wave through a uniform medium, read at two depths.
86
86
 
@@ -133,7 +133,7 @@ To start your own simulation, copy [simple_plane_wave.py](examples/simple_plane_
133
133
 
134
134
  ### Simulation guide
135
135
 
136
- [.claude/skills/fullwave25/SKILL.md](.claude/skills/fullwave25/SKILL.md) is a short guide to setting up a simulation the standard way. It covers:
136
+ [docs/claude_skill/fullwave25/SKILL.md](docs/claude_skill/fullwave25/SKILL.md) is a short guide to setting up a simulation the standard way. It covers:
137
137
 
138
138
  - the basic flow, the output shapes and the sensor order;
139
139
  - scatterers, air and the discretized attenuation values;
@@ -141,7 +141,7 @@ To start your own simulation, copy [simple_plane_wave.py](examples/simple_plane_
141
141
  - transducers, presets and beamforming;
142
142
  - multi-GPU runs, the container and troubleshooting.
143
143
 
144
- Read it before writing a new simulation. The same file is a [Claude Code](https://docs.anthropic.com/en/docs/claude-code) skill: Claude Code loads it in a clone of this repository, and you can copy the folder to `~/.claude/skills/fullwave25/` to use it in your own projects.
144
+ Read it before writing a new simulation. The same file is a [Claude Code](https://docs.anthropic.com/en/docs/claude-code) skill: to use it in Claude Code, copy the folder `docs/claude_skill/fullwave25/` to `~/.claude/skills/fullwave25/`.
145
145
 
146
146
  ## Transducers and transmits
147
147
 
@@ -35,7 +35,7 @@ The solver advances the pressure $p$ and the particle velocity $\mathbf{v}$ with
35
35
 
36
36
  $$\nabla_1 p + \rho \cfrac{\partial {\bf{v}}}{\partial t} = 0, \qquad \nabla_2 \cdot {\bf{v}} + \kappa \cfrac{\partial p}{\partial t} = 0 .$$
37
37
 
38
- in which the spatial derivatives $\nabla_1$ and $\nabla_2$ carry a set of relaxation mechanisms. fullwave25 looks up the parameters of these mechanisms in a precomputed table for the $\alpha_0$ and $\gamma$ of each cell, so that the simulated attenuation matches the power law and the phase velocity matches its Kramers-Kronig dispersion. The table spans $\alpha_0$ up to 1.0 dB/(MHz^γ cm) and $\gamma$ from 0.4 to 2.0, for frequencies from 0.1 to 20 MHz.
38
+ in which the spatial derivatives $\nabla_1$ and $\nabla_2$ carry a set of relaxation mechanisms. fullwave25 looks up the parameters of these mechanisms in a precomputed table for the $\alpha_0$ and $\gamma$ of each cell, so that the simulated attenuation matches the power law and the phase velocity matches its Kramers-Kronig dispersion. The table spans $\alpha_0$ up to 1.0 dB/(MHz^γ cm) and $\gamma$ from 0.4 to 2.0, for frequencies from 0.1 to 20 MHz. It extends to $\alpha_0$ = 2.0 dB/(MHz^γ cm) for $\gamma$ from 0.4 to 1.6, and to $\alpha_0$ = 10 dB/(MHz^γ cm) for $\gamma$ = 1.0. A specified pair on a cell the table does not fit logs a warning.
39
39
 
40
40
  The figure compares the target attenuation $\alpha_0 f^\gamma$ (red lines) with the simulated attenuation (black dots) for $\alpha_0 =$ 0.25, 0.5 and 0.75 dB/(MHz^γ cm) and $\gamma =$ 0.4, 0.7, 1.0, 1.3 and 1.6. Each dot is one simulation of a plane wave through a uniform medium, read at two depths.
41
41
 
@@ -88,7 +88,7 @@ To start your own simulation, copy [simple_plane_wave.py](examples/simple_plane_
88
88
 
89
89
  ### Simulation guide
90
90
 
91
- [.claude/skills/fullwave25/SKILL.md](.claude/skills/fullwave25/SKILL.md) is a short guide to setting up a simulation the standard way. It covers:
91
+ [docs/claude_skill/fullwave25/SKILL.md](docs/claude_skill/fullwave25/SKILL.md) is a short guide to setting up a simulation the standard way. It covers:
92
92
 
93
93
  - the basic flow, the output shapes and the sensor order;
94
94
  - scatterers, air and the discretized attenuation values;
@@ -96,7 +96,7 @@ To start your own simulation, copy [simple_plane_wave.py](examples/simple_plane_
96
96
  - transducers, presets and beamforming;
97
97
  - multi-GPU runs, the container and troubleshooting.
98
98
 
99
- Read it before writing a new simulation. The same file is a [Claude Code](https://docs.anthropic.com/en/docs/claude-code) skill: Claude Code loads it in a clone of this repository, and you can copy the folder to `~/.claude/skills/fullwave25/` to use it in your own projects.
99
+ Read it before writing a new simulation. The same file is a [Claude Code](https://docs.anthropic.com/en/docs/claude-code) skill: to use it in Claude Code, copy the folder `docs/claude_skill/fullwave25/` to `~/.claude/skills/fullwave25/`.
100
100
 
101
101
  ## Transducers and transmits
102
102
 
@@ -66,7 +66,7 @@ try:
66
66
  __version__ = version("fullwave")
67
67
  except PackageNotFoundError:
68
68
  # Update via bump-my-version, not manually
69
- __version__ = "1.4.3-dev0"
69
+ __version__ = "1.5.0-dev0"
70
70
 
71
71
  VERSION = __version__ # for convenience
72
72
  logger.info("Fullwave version: %s", __version__)
@@ -19,6 +19,7 @@ from fullwave.solver.utils import initialize_relaxation_param_dict
19
19
  from fullwave.utils import check_functions, plot_utils
20
20
  from fullwave.utils.coordinates import coords_to_map, map_to_coords
21
21
  from fullwave.utils.relaxation_parameters import (
22
+ RelaxationParametersGenerator,
22
23
  _array_module,
23
24
  band_scaled_sound_speed,
24
25
  generate_relaxation_params,
@@ -1258,9 +1259,11 @@ class Medium:
1258
1259
  Path to the relaxation parameters database.
1259
1260
  path_invalid_cells : Path, optional
1260
1261
  Path to the JSON record an evaluation wrote, which names every
1261
- invalid cell of the table and why it is invalid. A request that lands
1262
- on one is warned about, and the lookup still serves it. Without it
1263
- nothing is marked and the behaviour is unchanged.
1262
+ invalid cell of the table and why it is invalid. Without it, the
1263
+ record ``<table stem>_invalid_cells.json`` beside the table is read
1264
+ where it exists. A voxel on a ``not_fitted`` cell uses the nearest
1265
+ fitted exponent of the same row, and a voxel on another invalid cell
1266
+ uses that cell and warns.
1264
1267
  n_relaxation_mechanisms : int, optional
1265
1268
  Number of relaxation mechanisms, by default 4
1266
1269
  attenuation_builder : str, optional
@@ -1292,15 +1295,19 @@ class Medium:
1292
1295
  ``MediumRelaxationMaps.sound_speed`` reports the base speed that
1293
1296
  gives it. See ``band_scaled_sound_speed``.
1294
1297
  scale_to_requested_alpha_coeff : bool, optional
1295
- Give the requested attenuation coefficient rather than the
1296
- calibrated level the lookup serves. The coefficient axis holds
1297
- 0.0022 and then 0.01 to 1.00 in absolute steps of 0.01, so a request
1298
- between two levels is served the one above and a request past either
1299
- end is clipped. Setting this True scales the relaxation departure by
1300
- the shortfall instead. It matters most under a band transfer, which
1301
- multiplies the request by a factor and often carries it off the
1302
- axis. False, the default, reproduces every result produced before
1303
- this existed.
1298
+ Give the specified attenuation coefficient rather than the
1299
+ coefficient of the cell used. The coefficient axis holds
1300
+ 0.0022, then 0.01 to 1.00 in steps of 0.01, then 1.1 to 2.0 in
1301
+ steps of 0.1, then 3 to 10 in steps of 1, so a specified value
1302
+ between two nodes maps to the node above and a value past either
1303
+ end maps to the last node. Above 1.0 the table fits only some
1304
+ exponents, so a cell it does not fit maps to the fitted exponent
1305
+ nearest to it in the same coefficient row. The lookup logs a warning
1306
+ that names each specified value and the cell used. Setting this True
1307
+ scales the relaxation departure by the shortfall instead. It matters
1308
+ most under a band transfer, which multiplies the specified
1309
+ coefficient by a factor and often carries it off the axis. False,
1310
+ the default, reproduces every result produced before this existed.
1304
1311
  n_jobs : int, optional
1305
1312
  Number of parallel jobs for relaxation parameter calculation.
1306
1313
  Default is -1, which uses all available CPUs.
@@ -1612,6 +1619,20 @@ class Medium:
1612
1619
  }
1613
1620
  return relaxation_param_dict
1614
1621
 
1622
+ def _exponent_used(
1623
+ self,
1624
+ alpha_coeff: NDArray[np.float64],
1625
+ alpha_power: NDArray[np.float64],
1626
+ ) -> NDArray[np.float64]:
1627
+ """Return the exponent of the cell each voxel uses, which sets the band anchor."""
1628
+ if self.band_scale == 1.0:
1629
+ return alpha_power
1630
+ return RelaxationParametersGenerator(
1631
+ n_relaxation_mechanisms=self.n_relaxation_mechanisms,
1632
+ path_database=self.path_relaxation_parameters_database,
1633
+ path_invalid_cells=self.path_invalid_cells,
1634
+ )._exponent_used(alpha_coeff, alpha_power, band_scale=self.band_scale)
1635
+
1615
1636
  def relaxation_parameters_at(
1616
1637
  self,
1617
1638
  coords: NDArray[np.int64],
@@ -1636,7 +1657,7 @@ class Medium:
1636
1657
  sound_speed = band_scaled_sound_speed(
1637
1658
  self._to_numpy(self.sound_speed[index]),
1638
1659
  alpha_coeff,
1639
- alpha_power,
1660
+ self._exponent_used(alpha_coeff, alpha_power),
1640
1661
  self.band_scale,
1641
1662
  )
1642
1663
  parameters = self._relaxation_parameters_of(sound_speed, alpha_coeff, alpha_power)
@@ -1668,7 +1689,7 @@ class Medium:
1668
1689
  sound_speed = band_scaled_sound_speed(
1669
1690
  self.sound_speed,
1670
1691
  self.alpha_coeff,
1671
- self.alpha_power,
1692
+ self._exponent_used(self.alpha_coeff, self.alpha_power),
1672
1693
  self.band_scale,
1673
1694
  )
1674
1695
  relaxation_param_dict = self._relaxation_parameters_of(