From 263f3b0c7addce7bacbb068f75ea707cf20b6810 Mon Sep 17 00:00:00 2001 From: Frank14f <1515444314@qq.com> Date: Thu, 15 Oct 2026 10:13:51 +0800 Subject: [PATCH] Preserve bounded validation evidence and historical failures --- research/fine_surface_20261014/baseline.json | 389 + .../cpu_device_guard_cmd.txt | 1 + .../cpu_device_guard_exit.txt | 1 + .../cpu_device_guard_stdout.txt | 2 + .../cpu_existing_runs.json | 30 + .../fine_surface_20261014/cpu_final_run.json | 14 + .../cpu_final_stdout.txt | 2 + .../cpu_lifecycle_run.json | 14 + .../cpu_lifecycle_stdout.txt | 2 + .../fine_surface_20261014/cpu_maps_stdout.txt | 2 + .../cpu_preallocation_run.json | 14 + .../cpu_preallocation_stdout.txt | 2 + .../cpu_shared_kernel_stdout.txt | 2 + .../cpu_surface_command.txt | 1 + .../cpu_surface_exit.txt | 1 + .../cpu_surface_projection_command.txt | 1 + .../cpu_surface_projection_exit.txt | 1 + .../cpu_surface_projection_stdout.txt | 2 + .../cpu_surface_stdout.txt | 2 + .../gpu_preparation_run1.py | 290 + research/fine_surface_20261014/gpu_run.json | 48 + research/fine_surface_20261014/gpu_stdout.txt | 79 + .../fine_surface_20261014/gpu_test_run1.py | 316 + .../fine_surface_20261014/incremental.diff | 1099 + research/fine_surface_20261014/manifest.json | 102 + research/fine_surface_20261014/report.txt | 115 + .../baseline_00.json | 182 + .../baseline_01.json | 182 + .../baseline_02.json | 182 + .../baseline_03.json | 72 + .../blow_boundary.csv | 49 + .../blow_collisions.csv | 73 + .../blow_ledger.csv | 25 + .../blow_propagation.csv | 97 + .../blow_signals.npz | Bin 0 -> 221114 bytes .../blow_summary.json | 170 + .../fine_surface_joint_20261014/command.txt | 2 + .../fine_surface_joint_20261014/criteria.txt | 110 + .../fine_surface_joint_20261014/frozen.json | 105 + .../fine_surface_joint_20261014/gpu_run.json | 39 + .../incremental.diff | 10 + .../integrity.json | 38 + .../fine_surface_joint_20261014/manifest.json | 138 + .../fine_surface_joint_20261014/regions.json | 2766 +++ .../fine_surface_joint_20261014/report.txt | 110 + .../fine_surface_joint_20261014/result.json | 412 + .../fine_surface_joint_20261014/review.txt | 36 + .../fine_surface_joint_20261014/runner.py | 130 + .../fine_surface_joint_20261014/stdout.txt | 74 + .../suction_boundary.csv | 49 + .../suction_collisions.csv | 73 + .../suction_ledger.csv | 25 + .../suction_propagation.csv | 97 + .../suction_signals.npz | Bin 0 -> 220058 bytes .../suction_summary.json | 170 + .../fine_surface_joint_20261014/validate.py | 347 + .../zero_boundary.csv | 49 + .../zero_collisions.csv | 73 + .../zero_ledger.csv | 25 + .../zero_signals.npz | Bin 0 -> 127958 bytes .../zero_summary.json | 67 + .../fixed_patch_jet_20261013/baseline.json | 536 + research/fixed_patch_jet_20261013/before.json | 8 + .../fixed_patch_jet.py | 179 + .../incremental.patch | 182 + .../fixed_patch_jet_20261013/manifest.json | 53 + research/fixed_patch_jet_20261013/notes.txt | 7 + .../fixed_patch_jet_20261013/results.json | 33 + research/fixed_patch_jet_20261013/stdout.txt | 26 + .../baseline.json | 559 + .../cpu_results.json | 17 + .../cpu_stdout.txt | 1 + .../incremental.patch | 58 + .../layout_uncropped.png | Bin 0 -> 51785 bytes .../manifest.json | 55 + .../notes.txt | 15 + .../baseline.json | 548 + .../before.json | 8 + .../fixed_patch_jet.py | 193 + .../incremental.patch | 87 + .../manifest.json | 58 + .../notes.txt | 7 + .../results.json | 34 + .../stdout.txt | 26 + research/j1-2026-10-12/REVIEW.md | 55 + research/j1-2026-10-12/baseline-status.txt | 62 + research/j1-2026-10-12/baseline.json | 202 + research/j1-2026-10-12/incremental.diff | 629 + research/j1-2026-10-12/results.json | 2089 ++ research/j2-slot-2026-10-12/REVIEW.md | 119 + .../j2-slot-2026-10-12/baseline-status.txt | 67 + research/j2-slot-2026-10-12/baseline.json | 216 + research/j2-slot-2026-10-12/incremental.diff | 474 + research/j2-slot-2026-10-12/results.json | 17204 ++++++++++++++++ research/j3-coverage-2026-10-12/REVIEW.md | 94 + .../baseline-status.txt | 73 + research/j3-coverage-2026-10-12/baseline.json | 265 + .../j3-coverage-2026-10-12/incremental.diff | 348 + .../negative-budget-20744.h5 | Bin 0 -> 88017 bytes .../negative-end-20760.h5 | Bin 0 -> 88174 bytes .../j3-coverage-2026-10-12/restart-21280.h5 | Bin 0 -> 88062 bytes .../restart-reference-21296.h5 | Bin 0 -> 88154 bytes research/j3-coverage-2026-10-12/results.json | 12143 +++++++++++ .../j3-coverage-2026-10-12/verification.json | 31 + research/j3-lag-2026-10-12/REVIEW.md | 107 + .../j3-lag-2026-10-12/baseline-status.txt | 71 + research/j3-lag-2026-10-12/baseline.json | 232 + research/j3-lag-2026-10-12/end-21280.h5 | Bin 0 -> 92366 bytes research/j3-lag-2026-10-12/incremental.diff | 279 + research/j3-lag-2026-10-12/results.json | 811 + research/j3-lag-2026-10-12/start-20760.h5 | Bin 0 -> 92247 bytes research/j3-offline-2026-10-12/REVIEW.md | 68 + research/j3-offline-2026-10-12/lags.csv | 7 + .../j3-offline-2026-10-12/localization.png | Bin 0 -> 136013 bytes research/j3-offline-2026-10-12/regions.csv | 11 + research/j3-offline-2026-10-12/results.json | 253 + research/j3-reservoir-2026-10-12/REVIEW.md | 126 + .../baseline-status.txt | 69 + .../j3-reservoir-2026-10-12/baseline.json | 224 + .../j3-reservoir-2026-10-12/incremental.diff | 449 + research/j3-reservoir-2026-10-12/results.json | 5842 ++++++ .../refinement_example_20261013/baseline.json | 44 + .../refinement_example_20261013/before.json | 9 + .../incremental.patch | 177 + .../refinement_example_20261013/manifest.json | 47 + .../refinement_example_20261013/notes.txt | 4 + .../refinement_example_20261013/results.json | 33 + .../refinement_example_20261013/stdout.txt | 6 + .../refinement_followup_20261013/README.txt | 72 + .../baseline.json | 22 + .../refinement_followup_20261013/cleanup.json | 42 + .../cpu_results.json | 42 + .../cpu_results_attempt1.json | 27 + .../cpu_stdout.txt | 14 + .../cpu_stdout_attempt1.txt | 16 + .../gpu_before.json | 7 + .../gpu_before_no_launch.json | 7 + .../gpu_rectangle_before.json | 7 + ..._before_no_launch_1791886104981638567.json | 7 + .../gpu_rectangle_results.json | 34 + .../gpu_rectangle_stdout.txt | 8 + .../gpu_results.json | 46 + .../gpu_seed1_before.json | 7 + .../gpu_seed1_results.json | 34 + .../gpu_seed1_stdout.txt | 8 + .../gpu_stdout.txt | 1 + .../incremental.patch | 340 + .../manifest.json | 104 + .../refinement_followup_20261013/run_gpu.py | 97 + .../refinement_prepare_20261013/README.txt | 137 + .../refinement_prepare_20261013/baseline.json | 311 + .../incremental.patch | 317 + .../refinement_prepare_20261013/manifest.json | 59 + .../validation.json | 55 + .../validation.txt | 14 + .../refinement_slot_20261013/baseline.json | 521 + research/refinement_slot_20261013/before.json | 8 + .../refinement_slot_20261013/cpu_results.json | 32 + .../incremental.patch | 359 + .../refinement_slot_20261013/manifest.json | 65 + research/refinement_slot_20261013/notes.txt | 10 + .../refinement_slot_20261013/results.json | 34 + research/refinement_slot_20261013/stdout.txt | 11 + .../baseline.json | 527 + .../before.json | 8 + .../incremental.patch | 10 + .../manifest.json | 52 + .../notes.txt | 7 + .../planar_velocity.cuh | 44 + .../planar_velocity.sha256 | 2 + .../results.json | 31 + .../stdout.txt | 18 + research/refinement_step_20261013/README.txt | 162 + .../refinement_step_20261013/baseline.json | 317 + .../cpu_validation.json | 46 + .../gpu_failure_validation.json | 28 + .../gpu_failure_validation.txt | 7 + .../gpu_validation.json | 25 + .../gpu_validation.txt | 11 + .../incremental.patch | 549 + .../refinement_step_20261013/manifest.json | 52 + research/repair-2026-10-10/TRON_HANDOFF.md | 193 + .../repair-2026-10-10/baseline-hashes.json | 144 + .../repair-2026-10-10/baseline-status.txt | 10 + .../checkpoint-domain-2026-10-12.diff | 308 + .../repair-2026-10-10/classic-results.json | 8169 ++++++++ .../repair-2026-10-10/classic-signals.npz | Bin 0 -> 630332 bytes research/repair-2026-10-10/final-gpu.log | 3 + research/repair-2026-10-10/final-unit.log | 3 + research/repair-2026-10-10/provenance.json | 30 + .../repair-2026-10-10/repair-architecture.md | 71 + .../repair-2026-10-10/repair-numerical.md | 66 + research/repair-2026-10-10/repair-state.md | 75 + .../simplification-checks.log | 13 + .../surface_actuation_20261014/baseline.json | 387 + .../cpu_checkpoint_run.json | 18 + .../cpu_checkpoint_stdout.txt | 2 + .../cpu_initial.txt | 6 + .../cpu_surface_command.txt | 1 + .../cpu_surface_exit.txt | 1 + .../cpu_surface_stdout.txt | 2 + .../surface_actuation_20261014/gpu_run.json | 37 + .../surface_actuation_20261014/gpu_stdout.txt | 3 + .../incremental.diff | 1065 + .../surface_actuation_20261014/manifest.json | 101 + .../surface_actuation_20261014/report.txt | 66 + research/wall_seam_pulse_20261014/analyze.py | 231 + .../interpretation.txt | 59 + .../wall_seam_pulse_20261014/results.json | 621 + research/wall_seam_pulse_20261014/run.json | 16 + research/wall_seam_pulse_20261014/sources.csv | 31 + research/wall_seam_pulse_20261014/stdout.txt | 11 + .../multigrid/cpuref_0_3_evidence/README.txt | 64 + .../cpuref_0_3_evidence/README_grok.md | 18 + .../cpuref_0_3_evidence/baseline.json | 278 + .../cpuref_0_3_evidence/manifest.json | 96 + .../cpuref_0_3_evidence/results_horsea.json | 79 + .../cpuref_0_3_evidence/stdout_grok.txt | 84 + .../cpuref_0_3_evidence/stdout_horsea.txt | 130 + .../local_stress_v1_evidence/README.txt | 124 + .../TABLE_local_stress_observable_v1.md | 56 + .../local_stress_v1_evidence/baseline.json | 300 + .../local_stress_v1_evidence/comparison.json | 560 + .../local_stress_v1_evidence/manifest.json | 98 + .../results_horsea.json | 73 + .../local_stress_v1_evidence/run_once.py | 84 + .../source_manifest.json | 20 + .../stdout_horsea.txt | 122 + .../stdout_local_stress_observable_v1.txt | 118 + .../multigrid/shear_v0_2_evidence/README.txt | 115 + .../shear_v0_2_evidence/baseline.json | 289 + .../shear_v0_2_evidence/comparison.json | 296 + .../shear_v0_2_evidence/joint_report.md | 96 + .../shear_v0_2_evidence/manifest.json | 97 + .../shear_v0_2_evidence/results_horsea.json | 65 + .../multigrid/shear_v0_2_evidence/run_once.py | 74 + .../shear_v0_2_evidence/source_manifest.json | 20 + .../shear_v0_2_evidence/stdout_grok.txt | 89 + .../shear_v0_2_evidence/stdout_horsea.txt | 93 + 239 files changed, 74191 insertions(+) create mode 100644 research/fine_surface_20261014/baseline.json create mode 100644 research/fine_surface_20261014/cpu_device_guard_cmd.txt create mode 100644 research/fine_surface_20261014/cpu_device_guard_exit.txt create mode 100644 research/fine_surface_20261014/cpu_device_guard_stdout.txt create mode 100644 research/fine_surface_20261014/cpu_existing_runs.json create mode 100644 research/fine_surface_20261014/cpu_final_run.json create mode 100644 research/fine_surface_20261014/cpu_final_stdout.txt create mode 100644 research/fine_surface_20261014/cpu_lifecycle_run.json create mode 100644 research/fine_surface_20261014/cpu_lifecycle_stdout.txt create mode 100644 research/fine_surface_20261014/cpu_maps_stdout.txt create mode 100644 research/fine_surface_20261014/cpu_preallocation_run.json create mode 100644 research/fine_surface_20261014/cpu_preallocation_stdout.txt create mode 100644 research/fine_surface_20261014/cpu_shared_kernel_stdout.txt create mode 100644 research/fine_surface_20261014/cpu_surface_command.txt create mode 100644 research/fine_surface_20261014/cpu_surface_exit.txt create mode 100644 research/fine_surface_20261014/cpu_surface_projection_command.txt create mode 100644 research/fine_surface_20261014/cpu_surface_projection_exit.txt create mode 100644 research/fine_surface_20261014/cpu_surface_projection_stdout.txt create mode 100644 research/fine_surface_20261014/cpu_surface_stdout.txt create mode 100644 research/fine_surface_20261014/gpu_preparation_run1.py create mode 100644 research/fine_surface_20261014/gpu_run.json create mode 100644 research/fine_surface_20261014/gpu_stdout.txt create mode 100644 research/fine_surface_20261014/gpu_test_run1.py create mode 100644 research/fine_surface_20261014/incremental.diff create mode 100644 research/fine_surface_20261014/manifest.json create mode 100644 research/fine_surface_20261014/report.txt create mode 100644 research/fine_surface_joint_20261014/baseline_00.json create mode 100644 research/fine_surface_joint_20261014/baseline_01.json create mode 100644 research/fine_surface_joint_20261014/baseline_02.json create mode 100644 research/fine_surface_joint_20261014/baseline_03.json create mode 100644 research/fine_surface_joint_20261014/blow_boundary.csv create mode 100644 research/fine_surface_joint_20261014/blow_collisions.csv create mode 100644 research/fine_surface_joint_20261014/blow_ledger.csv create mode 100644 research/fine_surface_joint_20261014/blow_propagation.csv create mode 100644 research/fine_surface_joint_20261014/blow_signals.npz create mode 100644 research/fine_surface_joint_20261014/blow_summary.json create mode 100644 research/fine_surface_joint_20261014/command.txt create mode 100644 research/fine_surface_joint_20261014/criteria.txt create mode 100644 research/fine_surface_joint_20261014/frozen.json create mode 100644 research/fine_surface_joint_20261014/gpu_run.json create mode 100644 research/fine_surface_joint_20261014/incremental.diff create mode 100644 research/fine_surface_joint_20261014/integrity.json create mode 100644 research/fine_surface_joint_20261014/manifest.json create mode 100644 research/fine_surface_joint_20261014/regions.json create mode 100644 research/fine_surface_joint_20261014/report.txt create mode 100644 research/fine_surface_joint_20261014/result.json create mode 100644 research/fine_surface_joint_20261014/review.txt create mode 100644 research/fine_surface_joint_20261014/runner.py create mode 100644 research/fine_surface_joint_20261014/stdout.txt create mode 100644 research/fine_surface_joint_20261014/suction_boundary.csv create mode 100644 research/fine_surface_joint_20261014/suction_collisions.csv create mode 100644 research/fine_surface_joint_20261014/suction_ledger.csv create mode 100644 research/fine_surface_joint_20261014/suction_propagation.csv create mode 100644 research/fine_surface_joint_20261014/suction_signals.npz create mode 100644 research/fine_surface_joint_20261014/suction_summary.json create mode 100644 research/fine_surface_joint_20261014/validate.py create mode 100644 research/fine_surface_joint_20261014/zero_boundary.csv create mode 100644 research/fine_surface_joint_20261014/zero_collisions.csv create mode 100644 research/fine_surface_joint_20261014/zero_ledger.csv create mode 100644 research/fine_surface_joint_20261014/zero_signals.npz create mode 100644 research/fine_surface_joint_20261014/zero_summary.json create mode 100644 research/fixed_patch_jet_20261013/baseline.json create mode 100644 research/fixed_patch_jet_20261013/before.json create mode 100644 research/fixed_patch_jet_20261013/fixed_patch_jet.py create mode 100644 research/fixed_patch_jet_20261013/incremental.patch create mode 100644 research/fixed_patch_jet_20261013/manifest.json create mode 100644 research/fixed_patch_jet_20261013/notes.txt create mode 100644 research/fixed_patch_jet_20261013/results.json create mode 100644 research/fixed_patch_jet_20261013/stdout.txt create mode 100644 research/fixed_patch_jet_closure_20261013/baseline.json create mode 100644 research/fixed_patch_jet_closure_20261013/cpu_results.json create mode 100644 research/fixed_patch_jet_closure_20261013/cpu_stdout.txt create mode 100644 research/fixed_patch_jet_closure_20261013/incremental.patch create mode 100644 research/fixed_patch_jet_closure_20261013/layout_uncropped.png create mode 100644 research/fixed_patch_jet_closure_20261013/manifest.json create mode 100644 research/fixed_patch_jet_closure_20261013/notes.txt create mode 100644 research/fixed_patch_jet_records_20261013/baseline.json create mode 100644 research/fixed_patch_jet_records_20261013/before.json create mode 100644 research/fixed_patch_jet_records_20261013/fixed_patch_jet.py create mode 100644 research/fixed_patch_jet_records_20261013/incremental.patch create mode 100644 research/fixed_patch_jet_records_20261013/manifest.json create mode 100644 research/fixed_patch_jet_records_20261013/notes.txt create mode 100644 research/fixed_patch_jet_records_20261013/results.json create mode 100644 research/fixed_patch_jet_records_20261013/stdout.txt create mode 100644 research/j1-2026-10-12/REVIEW.md create mode 100644 research/j1-2026-10-12/baseline-status.txt create mode 100644 research/j1-2026-10-12/baseline.json create mode 100644 research/j1-2026-10-12/incremental.diff create mode 100644 research/j1-2026-10-12/results.json create mode 100644 research/j2-slot-2026-10-12/REVIEW.md create mode 100644 research/j2-slot-2026-10-12/baseline-status.txt create mode 100644 research/j2-slot-2026-10-12/baseline.json create mode 100644 research/j2-slot-2026-10-12/incremental.diff create mode 100644 research/j2-slot-2026-10-12/results.json create mode 100644 research/j3-coverage-2026-10-12/REVIEW.md create mode 100644 research/j3-coverage-2026-10-12/baseline-status.txt create mode 100644 research/j3-coverage-2026-10-12/baseline.json create mode 100644 research/j3-coverage-2026-10-12/incremental.diff create mode 100644 research/j3-coverage-2026-10-12/negative-budget-20744.h5 create mode 100644 research/j3-coverage-2026-10-12/negative-end-20760.h5 create mode 100644 research/j3-coverage-2026-10-12/restart-21280.h5 create mode 100644 research/j3-coverage-2026-10-12/restart-reference-21296.h5 create mode 100644 research/j3-coverage-2026-10-12/results.json create mode 100644 research/j3-coverage-2026-10-12/verification.json create mode 100644 research/j3-lag-2026-10-12/REVIEW.md create mode 100644 research/j3-lag-2026-10-12/baseline-status.txt create mode 100644 research/j3-lag-2026-10-12/baseline.json create mode 100644 research/j3-lag-2026-10-12/end-21280.h5 create mode 100644 research/j3-lag-2026-10-12/incremental.diff create mode 100644 research/j3-lag-2026-10-12/results.json create mode 100644 research/j3-lag-2026-10-12/start-20760.h5 create mode 100644 research/j3-offline-2026-10-12/REVIEW.md create mode 100644 research/j3-offline-2026-10-12/lags.csv create mode 100644 research/j3-offline-2026-10-12/localization.png create mode 100644 research/j3-offline-2026-10-12/regions.csv create mode 100644 research/j3-offline-2026-10-12/results.json create mode 100644 research/j3-reservoir-2026-10-12/REVIEW.md create mode 100644 research/j3-reservoir-2026-10-12/baseline-status.txt create mode 100644 research/j3-reservoir-2026-10-12/baseline.json create mode 100644 research/j3-reservoir-2026-10-12/incremental.diff create mode 100644 research/j3-reservoir-2026-10-12/results.json create mode 100644 research/refinement_example_20261013/baseline.json create mode 100644 research/refinement_example_20261013/before.json create mode 100644 research/refinement_example_20261013/incremental.patch create mode 100644 research/refinement_example_20261013/manifest.json create mode 100644 research/refinement_example_20261013/notes.txt create mode 100644 research/refinement_example_20261013/results.json create mode 100644 research/refinement_example_20261013/stdout.txt create mode 100644 research/refinement_followup_20261013/README.txt create mode 100644 research/refinement_followup_20261013/baseline.json create mode 100644 research/refinement_followup_20261013/cleanup.json create mode 100644 research/refinement_followup_20261013/cpu_results.json create mode 100644 research/refinement_followup_20261013/cpu_results_attempt1.json create mode 100644 research/refinement_followup_20261013/cpu_stdout.txt create mode 100644 research/refinement_followup_20261013/cpu_stdout_attempt1.txt create mode 100644 research/refinement_followup_20261013/gpu_before.json create mode 100644 research/refinement_followup_20261013/gpu_before_no_launch.json create mode 100644 research/refinement_followup_20261013/gpu_rectangle_before.json create mode 100644 research/refinement_followup_20261013/gpu_rectangle_before_no_launch_1791886104981638567.json create mode 100644 research/refinement_followup_20261013/gpu_rectangle_results.json create mode 100644 research/refinement_followup_20261013/gpu_rectangle_stdout.txt create mode 100644 research/refinement_followup_20261013/gpu_results.json create mode 100644 research/refinement_followup_20261013/gpu_seed1_before.json create mode 100644 research/refinement_followup_20261013/gpu_seed1_results.json create mode 100644 research/refinement_followup_20261013/gpu_seed1_stdout.txt create mode 100644 research/refinement_followup_20261013/gpu_stdout.txt create mode 100644 research/refinement_followup_20261013/incremental.patch create mode 100644 research/refinement_followup_20261013/manifest.json create mode 100644 research/refinement_followup_20261013/run_gpu.py create mode 100644 research/refinement_prepare_20261013/README.txt create mode 100644 research/refinement_prepare_20261013/baseline.json create mode 100644 research/refinement_prepare_20261013/incremental.patch create mode 100644 research/refinement_prepare_20261013/manifest.json create mode 100644 research/refinement_prepare_20261013/validation.json create mode 100644 research/refinement_prepare_20261013/validation.txt create mode 100644 research/refinement_slot_20261013/baseline.json create mode 100644 research/refinement_slot_20261013/before.json create mode 100644 research/refinement_slot_20261013/cpu_results.json create mode 100644 research/refinement_slot_20261013/incremental.patch create mode 100644 research/refinement_slot_20261013/manifest.json create mode 100644 research/refinement_slot_20261013/notes.txt create mode 100644 research/refinement_slot_20261013/results.json create mode 100644 research/refinement_slot_20261013/stdout.txt create mode 100644 research/refinement_slot_followup_20261013/baseline.json create mode 100644 research/refinement_slot_followup_20261013/before.json create mode 100644 research/refinement_slot_followup_20261013/incremental.patch create mode 100644 research/refinement_slot_followup_20261013/manifest.json create mode 100644 research/refinement_slot_followup_20261013/notes.txt create mode 100644 research/refinement_slot_followup_20261013/planar_velocity.cuh create mode 100644 research/refinement_slot_followup_20261013/planar_velocity.sha256 create mode 100644 research/refinement_slot_followup_20261013/results.json create mode 100644 research/refinement_slot_followup_20261013/stdout.txt create mode 100644 research/refinement_step_20261013/README.txt create mode 100644 research/refinement_step_20261013/baseline.json create mode 100644 research/refinement_step_20261013/cpu_validation.json create mode 100644 research/refinement_step_20261013/gpu_failure_validation.json create mode 100644 research/refinement_step_20261013/gpu_failure_validation.txt create mode 100644 research/refinement_step_20261013/gpu_validation.json create mode 100644 research/refinement_step_20261013/gpu_validation.txt create mode 100644 research/refinement_step_20261013/incremental.patch create mode 100644 research/refinement_step_20261013/manifest.json create mode 100644 research/repair-2026-10-10/TRON_HANDOFF.md create mode 100644 research/repair-2026-10-10/baseline-hashes.json create mode 100644 research/repair-2026-10-10/baseline-status.txt create mode 100644 research/repair-2026-10-10/checkpoint-domain-2026-10-12.diff create mode 100644 research/repair-2026-10-10/classic-results.json create mode 100644 research/repair-2026-10-10/classic-signals.npz create mode 100644 research/repair-2026-10-10/final-gpu.log create mode 100644 research/repair-2026-10-10/final-unit.log create mode 100644 research/repair-2026-10-10/provenance.json create mode 100644 research/repair-2026-10-10/repair-architecture.md create mode 100644 research/repair-2026-10-10/repair-numerical.md create mode 100644 research/repair-2026-10-10/repair-state.md create mode 100644 research/repair-2026-10-10/simplification-checks.log create mode 100644 research/surface_actuation_20261014/baseline.json create mode 100644 research/surface_actuation_20261014/cpu_checkpoint_run.json create mode 100644 research/surface_actuation_20261014/cpu_checkpoint_stdout.txt create mode 100644 research/surface_actuation_20261014/cpu_initial.txt create mode 100644 research/surface_actuation_20261014/cpu_surface_command.txt create mode 100644 research/surface_actuation_20261014/cpu_surface_exit.txt create mode 100644 research/surface_actuation_20261014/cpu_surface_stdout.txt create mode 100644 research/surface_actuation_20261014/gpu_run.json create mode 100644 research/surface_actuation_20261014/gpu_stdout.txt create mode 100644 research/surface_actuation_20261014/incremental.diff create mode 100644 research/surface_actuation_20261014/manifest.json create mode 100644 research/surface_actuation_20261014/report.txt create mode 100644 research/wall_seam_pulse_20261014/analyze.py create mode 100644 research/wall_seam_pulse_20261014/interpretation.txt create mode 100644 research/wall_seam_pulse_20261014/results.json create mode 100644 research/wall_seam_pulse_20261014/run.json create mode 100644 research/wall_seam_pulse_20261014/sources.csv create mode 100644 research/wall_seam_pulse_20261014/stdout.txt create mode 100644 tests/validation/multigrid/cpuref_0_3_evidence/README.txt create mode 100644 tests/validation/multigrid/cpuref_0_3_evidence/README_grok.md create mode 100644 tests/validation/multigrid/cpuref_0_3_evidence/baseline.json create mode 100644 tests/validation/multigrid/cpuref_0_3_evidence/manifest.json create mode 100644 tests/validation/multigrid/cpuref_0_3_evidence/results_horsea.json create mode 100644 tests/validation/multigrid/cpuref_0_3_evidence/stdout_grok.txt create mode 100644 tests/validation/multigrid/cpuref_0_3_evidence/stdout_horsea.txt create mode 100644 tests/validation/multigrid/local_stress_v1_evidence/README.txt create mode 100644 tests/validation/multigrid/local_stress_v1_evidence/TABLE_local_stress_observable_v1.md create mode 100644 tests/validation/multigrid/local_stress_v1_evidence/baseline.json create mode 100644 tests/validation/multigrid/local_stress_v1_evidence/comparison.json create mode 100644 tests/validation/multigrid/local_stress_v1_evidence/manifest.json create mode 100644 tests/validation/multigrid/local_stress_v1_evidence/results_horsea.json create mode 100644 tests/validation/multigrid/local_stress_v1_evidence/run_once.py create mode 100644 tests/validation/multigrid/local_stress_v1_evidence/source_manifest.json create mode 100644 tests/validation/multigrid/local_stress_v1_evidence/stdout_horsea.txt create mode 100644 tests/validation/multigrid/local_stress_v1_evidence/stdout_local_stress_observable_v1.txt create mode 100644 tests/validation/multigrid/shear_v0_2_evidence/README.txt create mode 100644 tests/validation/multigrid/shear_v0_2_evidence/baseline.json create mode 100644 tests/validation/multigrid/shear_v0_2_evidence/comparison.json create mode 100644 tests/validation/multigrid/shear_v0_2_evidence/joint_report.md create mode 100644 tests/validation/multigrid/shear_v0_2_evidence/manifest.json create mode 100644 tests/validation/multigrid/shear_v0_2_evidence/results_horsea.json create mode 100644 tests/validation/multigrid/shear_v0_2_evidence/run_once.py create mode 100644 tests/validation/multigrid/shear_v0_2_evidence/source_manifest.json create mode 100644 tests/validation/multigrid/shear_v0_2_evidence/stdout_grok.txt create mode 100644 tests/validation/multigrid/shear_v0_2_evidence/stdout_horsea.txt diff --git a/research/fine_surface_20261014/baseline.json b/research/fine_surface_20261014/baseline.json new file mode 100644 index 0000000..71a4543 --- /dev/null +++ b/research/fine_surface_20261014/baseline.json @@ -0,0 +1,389 @@ +{ + "head": "6e3756c587ec08ab6a55c4a1a5f4671822d3f0a0", + "status": " M pyproject.toml\n M setup.py\n M src/CelerisLab/__init__.py\n M src/CelerisLab/body/__init__.py\n M src/CelerisLab/body/ddf_patch.py\n M src/CelerisLab/body/manager.py\n M src/CelerisLab/body/objects.py\n M src/CelerisLab/body/preprocess/flag_overlay.py\n M src/CelerisLab/common/__init__.py\n M src/CelerisLab/common/checkpoint.py\n M src/CelerisLab/config.py\n M src/CelerisLab/configs/CONFIG.md\n M src/CelerisLab/cuda/__init__.py\n M src/CelerisLab/cuda/compiler_v2.py\n M src/CelerisLab/cuda/context.py\n M src/CelerisLab/lbm/__init__.py\n M src/CelerisLab/lbm/curved_links.py\n M src/CelerisLab/lbm/field.py\n M src/CelerisLab/lbm/initializers.py\n M src/CelerisLab/lbm/kernels/boundary/bounce_back.cuh\n M src/CelerisLab/lbm/kernels/boundary/curved_boundary.cuh\n M src/CelerisLab/lbm/kernels/boundary/inlet/common.cuh\n M src/CelerisLab/lbm/kernels/boundary/inlet/zou_he_local.cuh\n M src/CelerisLab/lbm/kernels/boundary/inlet_outlet.cuh\n M src/CelerisLab/lbm/kernels/config/config_grid.h\n M src/CelerisLab/lbm/kernels/config/config_method.h\n M src/CelerisLab/lbm/kernels/config/config_objects.h\n M src/CelerisLab/lbm/kernels/config/config_physics.h\n M src/CelerisLab/lbm/kernels/kernel_v2.cu\n M src/CelerisLab/lbm/kernels/operators/collision_mrt.cuh\n M src/CelerisLab/lbm/kernels/operators/collision_trt.cuh\n M src/CelerisLab/lbm/kernels/operators/forcing_guo.cuh\n M src/CelerisLab/lbm/kernels/step/aux_kernels.cu\n M src/CelerisLab/lbm/kernels/step/esopull_sync.cu\n M src/CelerisLab/lbm/kernels/step/init_flow.cu\n M src/CelerisLab/lbm/kernels/step/one_step_double.cu\n M src/CelerisLab/lbm/kernels/step/one_step_esopull.cu\n M src/CelerisLab/lbm/kernels/streaming/esopull_semantic_helpers.cuh\n M src/CelerisLab/lbm/stepper.py\n M src/CelerisLab/simulation.py\n M tests/integration/test_body_sync_e2e.py\n M tests/integration/test_ddf_patch.py\n M tests/integration/test_sync_bodies_skeleton.py\n M tests/integration/test_unified_obs.py\n M tests/postproc/experiment.ipynb\n M tests/validation/run_kan99b_rotating_cylinder.py\n M tests/validation/run_sah04_st_matrix.py\n M tests/validation/test_sensor_accuracy.py\n?? docs/design/\n?? docs/multilevel_grid_architecture_analysis.md\n?? examples/\n?? research/\n?? src/CelerisLab/lbm/kernels/boundary/planar_velocity.cuh\n?? src/CelerisLab/lbm/kernels/refinement.cu\n?? src/CelerisLab/lbm/refinement.py\n?? src/CelerisLab/lbm/refinement_stepper.py\n?? \"tests/audit/body\\345\\210\\240\\345\\207\\217\\345\\212\\237\\350\\203\\275.md\"\n?? tests/integration/_cases.py\n?? tests/integration/test_numerical_gpu.py\n?? tests/integration/test_runtime_contracts_gpu.py\n?? tests/integration/test_state_gpu.py\n?? tests/integration/test_surface_actuation_gpu.py\n?? tests/unit/cpp/\n?? tests/unit/test_build_contracts.py\n?? tests/unit/test_context_ownership.py\n?? tests/unit/test_initializers.py\n?? tests/unit/test_numerical_operators.py\n?? tests/unit/test_planar_velocity.py\n?? tests/unit/test_refinement.py\n?? tests/unit/test_reservoir.py\n?? tests/unit/test_simulation_lifecycle.py\n?? tests/unit/test_slot_velocity.py\n?? tests/unit/test_state_regressions.py\n?? tests/unit/test_surface_actuation.py\n?? tests/validation/analyze_j3_saved_frames.py\n?? tests/validation/diagnose_j3_lags.py\n?? tests/validation/multigrid/\n?? tests/validation/run_j1.py\n?? tests/validation/run_j2_slot.py\n?? tests/validation/run_j3_coverage.py\n?? tests/validation/run_j3_reservoir.py\n?? tests/validation/run_poiseuille.py\n", + "copy_dir": "/tmp/celeris-fine-surface-baseline-z98oi6ps", + "hashes": { + "src/CelerisLab.egg-info/PKG-INFO": "0b9a8a4e8d60bc531473688723ddef0aab02c7ccc4997e31c9b6a6c35011ca77", + "src/CelerisLab.egg-info/top_level.txt": "cd51958ca03afabbaa9618c60b8280e486f8cc0b0359b839e10f886e7c3948f8", + "src/CelerisLab.egg-info/dependency_links.txt": "01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b", + "src/CelerisLab.egg-info/requires.txt": "36e1404178e5ea590b2fc04e8ba4d748ec9a82e7693136ccf0dfd204fe265c04", + "src/CelerisLab.egg-info/SOURCES.txt": "f36b29c1b34c4bd6b2acc3ccdd21c24ee5077df7e2a20a652d9fae77eedb8e21", + "src/CelerisLab/simulation.py": "c9d903f53fe356d7af281bea07943de1a62494127fb69848d7053fd46f7dec3e", + "src/CelerisLab/config.py": "2f1bba7515f5bc08cb3a8d140bcafe7fa0689e01b3b06494697bb2956a71530e", + "src/CelerisLab/__init__.py": "21cc469bd6e970a1f9ff5970c8eea4602065e41fc881854759ee565ee55c10c6", + "src/CelerisLab/cuda/compiler_v2.py": "c4cc3ec4445c8d75e6a253dd87963877117a722bc73b9d4811806fc6045d08c1", + "src/CelerisLab/cuda/obs_layout.py": "5ffb2c3aeeaaaaeb64f2cd8febfbcf4ad9919e5414020ad753cfade0683b21c2", + "src/CelerisLab/cuda/context.py": "013dd4ec6d01d2fbd11afdfb103eac6a273bd9f798d663d761b851eeb27885e9", + "src/CelerisLab/cuda/__init__.py": "0d01dff9f0399c8baba822aab5ca0122a135f011008ed8a499ebd9f7e5b06aea", + "src/CelerisLab/lbm/refinement_stepper.py": "ad57a6a3887b007488b4954b24ff06cd8cde2b12674bdafb97bfda1961ae1da4", + "src/CelerisLab/lbm/field.py": "0e727eacc3706add4d8d15c418e9b631050871f831698d3ac689dd5f2c701b9b", + "src/CelerisLab/lbm/equilibrium.py": "2fb2f2bb7ff326d23abce80fc2a4c0907b17740ea3e29fe6ae079c5044783826", + "src/CelerisLab/lbm/descriptors.py": "c9f025dfc14da43b989047b84cc22bd05d5cc92c9ec695c1da68fdfb788e3f2b", + "src/CelerisLab/lbm/initializers.py": "dacf9586963e862d6d0a98ef1a066036be6f91e9d423720661d8ef2c1fb2df6a", + "src/CelerisLab/lbm/curved_links.py": "00d9c29d660b41190f32dd737b12f60e10ce4214b6c9a6ab2a63438813faa594", + "src/CelerisLab/lbm/stepper.py": "d2ef351aa2de441ec123deb55ce35603064130222f5490b154d41756b755cd73", + "src/CelerisLab/lbm/__init__.py": "7f60fb3aaae81501b510d08c2fedff44fcb05657260eb10b6f5cc91e7204306b", + "src/CelerisLab/lbm/refinement.py": "554735c5613129eb29f339c6aeeb4f3a3bbc5aba67558be51fbf7c2fb6ac442a", + "src/CelerisLab/lbm/kernels/kernel_v2.cu": "c7bd3fb705b77261ba2441c52a24a7e6a7865c165cba088a1b75201c4d29c408", + "src/CelerisLab/lbm/kernels/refinement.cu": "025c59dc9c207a831e78e1635cb3f14fe60b64c021004a0d66e5d01fda8554b5", + "src/CelerisLab/lbm/kernels/config.h": "7d1124125e0b354558297934460e64c760fb68cdd7bf6d01a1238bb2eaab8c37", + "src/CelerisLab/lbm/kernels/kernel_v2.ptx": "a599ee30ae66800f4d4220eb79dfed35ff32991661260f01ea58023ef780f0ca", + "src/CelerisLab/lbm/kernels/operators/turbulence_smag.cuh": "ff7f000297ee0817e255ad9fcb6a13b647e3ddd5b206518d35f38d2895a9f501", + "src/CelerisLab/lbm/kernels/operators/collision_mrt.cuh": "aee444eb60c47a3fd518dca975d1af05425a0818a0ec6c3fb3f6150f60c2cb44", + "src/CelerisLab/lbm/kernels/operators/collision_trt.cuh": "9725b9840b9ad8b4ec7be61ff5d06d3151e86d1a87585c13f2fbf934d0d2c5f6", + "src/CelerisLab/lbm/kernels/operators/collision_srt.cuh": "6b7ff842f392c8f853d2d1a97cc69bfe50f21283f73e659404da07cf6c95f5e1", + "src/CelerisLab/lbm/kernels/operators/forcing_guo.cuh": "969a430c1af03f32e3bd0df95d805e64f56334717c44dd4ba208ba503062a24b", + "src/CelerisLab/lbm/kernels/operators/macro.cuh": "e27c1c410dc857be98da4596568e405eeaf88701d291ac0e398aa9cd23dee740", + "src/CelerisLab/lbm/kernels/operators/helpers.cuh": "0b3a4d95d7d19f5fec09e5423b8f4cc99f8a226b541967425967330da5a051ec", + "src/CelerisLab/lbm/kernels/core/precision.cuh": "849df14b4cce50af52399e4b8f3e997196f3ae5f1163f68e28df3e6b2507a8c4", + "src/CelerisLab/lbm/kernels/core/descriptors.cuh": "8440bc14857da9007982650f828a23608eec9f7cc4bf772e8c8dc1239cb45356", + "src/CelerisLab/lbm/kernels/core/obs.cuh": "b742b77c9f61e1f020fe9922c3838ae9d855e17b381154958b58f10a22938922", + "src/CelerisLab/lbm/kernels/core/params.cuh": "6e18bf730d936d940e3d85452f0714a2eaae31bf41002f9fd520ec5b372878dd", + "src/CelerisLab/lbm/kernels/core/flags.cuh": "0025705f24710330d9d9195f713879bfb650a85a3449baef0e196b831af104ab", + "src/CelerisLab/lbm/kernels/core/layout.cuh": "1fbd820021c89ac3efcde24145996cb0147769e607e498e61f308ed3e0b13706", + "src/CelerisLab/lbm/kernels/boundary/ibm_kernels.cuh": "e6909b547dc8d64cdd8a76a90660243a8f5fee535caa161b52b4dd8b7c29934b", + "src/CelerisLab/lbm/kernels/boundary/planar_velocity.cuh": "0b2f9e0bd483c199637e5672dc0ffc460bc383dd1804805befbeb4c5d8c708d1", + "src/CelerisLab/lbm/kernels/boundary/inlet_outlet.cuh": "de8b213a6da42c2e5e9f8966199fc66ea4541b85144a90f3f5dbad3c6ab63b97", + "src/CelerisLab/lbm/kernels/boundary/curved_boundary.cuh": "7bccf7e7091c012d7a3d4874a881d4d46699021faedd83d125933fbdaa562711", + "src/CelerisLab/lbm/kernels/boundary/bounce_back.cuh": "aba3748c564ed91b161d268ef8b737b7c7be96a823063d201f3da684dd845233", + "src/CelerisLab/lbm/kernels/boundary/esopull_curved_helpers.cuh": "b9b474bc4edaff05681c5443235472d04072d0d775fc0eb9c5967faef52b0258", + "src/CelerisLab/lbm/kernels/boundary/inlet/equilibrium.cuh": "f0964c811b2c41a5aaa1c6d99c490b06e850c634eb8749f1f05ef61f93c2de1d", + "src/CelerisLab/lbm/kernels/boundary/inlet/channel_stabilized.cuh": "efe077afcbb6b731256a987c2fd79a1dbc470c902f87070d60421ea6cb13d4e2", + "src/CelerisLab/lbm/kernels/boundary/inlet/common.cuh": "f3cec54c8873c65b3dca4375605d2c89a8727765884d3954c235242fdff9c6ba", + "src/CelerisLab/lbm/kernels/boundary/inlet/zou_he_local.cuh": "e73e66b853b1e4e0e30d8f4185d832aa414ce670a1813ce2b5459f2887f71f89", + "src/CelerisLab/lbm/kernels/boundary/inlet/regularized.cuh": "943d4a571818bacb89c70bccfaac202691121e3e385803ce6309123a0a03ddaf", + "src/CelerisLab/lbm/kernels/boundary/outlet/pressure_neq.cuh": "c8b2adc66d12fe602076ddc9693c5c208711fcaddb58aa9a31401a269f51c4c4", + "src/CelerisLab/lbm/kernels/streaming/esopull_single_buffer.cuh": "77ed4ab9a0ebc5ff62a91a7c39066ef395391ae36e9040a69fb2bd8b1626dc79", + "src/CelerisLab/lbm/kernels/streaming/pull_double_buffer.cuh": "b65d741ed78b7b62f99531ba0c0ce1936663d8dc9640e7d7d16c707f1baf6549", + "src/CelerisLab/lbm/kernels/streaming/esopull_semantic_helpers.cuh": "dd5a9091628b079efd97e53fd49e52d09dcee88529235db77a5648e02937af6e", + "src/CelerisLab/lbm/kernels/step/esopull_sync.cu": "c0ff3e72900c3ab89a05dd03684e96d3b740cf1672d565727fc2af165933d087", + "src/CelerisLab/lbm/kernels/step/init_flow.cu": "305be3bb12fc0d039acec1701baabcf0e8a35e683c49c34f2af8ca9867d2b29c", + "src/CelerisLab/lbm/kernels/step/esopull_macro.cu": "c73116020ca217ede1e4de27c8269c31f9d91e33433ac8252a21e9b14187c50f", + "src/CelerisLab/lbm/kernels/step/aux_kernels.cu": "e163257b9cbbcdd289bf2a76b5b147ed9512dd04825ddfc9518fb626c8cff00e", + "src/CelerisLab/lbm/kernels/step/one_step_esopull.cu": "aa223b2744ae6c9125673df311a96ce588032c1ba58bebb11fd33ecb990f8ed4", + "src/CelerisLab/lbm/kernels/step/one_step_double.cu": "f9f8242b38e8e0cf8425b75e2b0215bc15363c62eaa0fb43c761b8e0931bfdc9", + "src/CelerisLab/lbm/kernels/config/config_physics.h": "26df33c2960ba36f3283e19b55b4ea92e50e4efda705f9ebfbf3f875a4092c59", + "src/CelerisLab/lbm/kernels/config/config_method.h": "3db4e16ef2c6b22349d04e6aa8ab04bdfe0eb784f9f3a98277e15dbed1835d81", + "src/CelerisLab/lbm/kernels/config/config_grid.h": "8be3a7cf74ba30d7fd3074fed79e63dbda7311c4d03b454ea641bf298ffeaa8d", + "src/CelerisLab/lbm/kernels/config/config_objects.h": "dbb93c063586da278c15d95e23f84c12e728f4f5f1bbc3980fe9cedaa6fff90e", + "src/CelerisLab/lbm/kernels/config/config_obs.h": "c11e2249359145b5c4cbaaf0487506fa77c1f4b82c7c169ddc574aa0babcd727", + "src/CelerisLab/common/checkpoint.py": "b2f960aecd5ac27a3a7130b809ffad4709c44d522edef0359ab952654625410b", + "src/CelerisLab/common/_types.py": "aad2ff1a9033d4fd68783ad7123afb47201ddc58785cb6dc0246947037072a5f", + "src/CelerisLab/common/pathline.py": "a1b6efcc0a076d0f1dc8d49a595779426d7d5626b00072a59bac710ff02ad046", + "src/CelerisLab/common/__init__.py": "d4dbde78bc97fccc9eabac9abae8f0f15c112c10ff8e9b45bd9401d4723df1ef", + "src/CelerisLab/common/preprocess.py": "7fc78a08857cf8e98519500b094a1d896af189b6b15658ff9b388ed51bed4515", + "src/CelerisLab/common/render.py": "0e055476257eb2bcd11e733766e52195de02f8fad228f570a3511a7c831bdc29", + "src/CelerisLab/common/streakline/_render.py": "236cd637414ee318c4d66f9aed32110d8dc42a100d65fde06172f7cd0ba62c65", + "src/CelerisLab/common/streakline/_integrate.py": "3fbd4368b2c8d0e7fda40dc65aac5df02b085008b4c68acd83cb7ae45d33a13b", + "src/CelerisLab/common/streakline/_streakline.py": "1a3e08daa706b5f83cdeb337e9a945a36ddf7583c40af1d0bb9d825ac954df37", + "src/CelerisLab/common/streakline/__init__.py": "13ff1cfa416fdd721a08a659e76b5a5a99b8d3201add10a83b7b0bc654bc1eec", + "src/CelerisLab/common/streakline/_config.py": "a9185ef68e9c7b5d5a1dc0b04a28341e2ad91d13c145a7c106636a878cf0a605", + "src/CelerisLab/configs/config_lbm.json": "17e4311f1f250c6ece59177a8b6ff856b69a016c7c10267e774b030a0a390865", + "src/CelerisLab/configs/CONFIG.md": "41cafdbe525366c08aa9d0416ea026ccf0026ba7123b8a9b65f968a80d928e3a", + "src/CelerisLab/configs/config_lbm_three_cylinder_triangle.json": "eeb8e7149dbe4aa6b3a9562802735aa950750dfbe2d972a0727e788573afa817", + "src/CelerisLab/configs/config_lbm_flume_trt_regularized.json": "f4bba8e6a4339fc3c4eb14f6e2f57c4b22993c73703c773d853edfbe34736e56", + "src/CelerisLab/configs/config_body.json": "055f261f0828ca1d4f2bb694bd15b72bbcabe31d552326208f28e37f761adab1", + "src/CelerisLab/configs/config_lbm_flume_mrt_zouhe.json": "8f593321db05a563a42931603a228d61cbcba06dfbe113262d5cd0ad93c0fe79", + "src/CelerisLab/body/objects.py": "d1cf7054cc8379a83c39acc66a7c88ae62fa004f110bb0c1def2ee57137401c5", + "src/CelerisLab/body/action_smoother.py": "b1a23ee6bbd4850b172cb8738c5c3546ee465a54189e6af9d8044f023d4687dc", + "src/CelerisLab/body/registry.py": "fbb7327780adbdc6da15ebdb799980daf32df22ee974af0893d7409f177bbb68", + "src/CelerisLab/body/manager.py": "6a40be708c71ef6f3b5f5f0aa9c92cfafc51f2ec2a958f99656cccb850986c16", + "src/CelerisLab/body/ddf_patch.py": "60fcfb7441e73bf290bcff41ca3a83da3e7ddad765d7247464e8f02e3043b4e2", + "src/CelerisLab/body/sync_plan.py": "a73ac9ee361b2120d0b7bbebeaa2ccbf924ba27bd95d4dd4b383c10a39b2a409", + "src/CelerisLab/body/__init__.py": "91d1155080b3ade83d13c84c39693046df122e4bed5ef583de2df1f9453c1b76", + "src/CelerisLab/body/preprocess/flag_overlay.py": "831fc9e9736b758847759a085ff133eb49ec91318ace4fda76f85960138ee300", + "src/CelerisLab/body/preprocess/__init__.py": "dfd9d58bc07f626ab23a70053e31b88a6d9165d2e4c76a4e9f48abe674d3d2ec", + "src/CelerisLab/body/geometry/base.py": "cceca14361ca2f34d34a3e43730e1a79b8ca81be00f0dd62e884db32b479419f", + "src/CelerisLab/body/geometry/__init__.py": "ada88980ab672959aca9aa3a4c4aade3219524b2ab68110cd2a2f41e3e0ca90a", + "src/CelerisLab/body/geometry/circle.py": "7605ca7c21103f1d801ac73ab8dd18dffbdac425b2dee7b8858b283628a9e436", + "src/CelerisLab/body/coupling/soa_packer.py": "8ec26fd55ef74801bbd5ab6bd3d0a7dabc750cbd498aaac2ca4c61a0108ad3c9", + "src/CelerisLab/body/coupling/__init__.py": "c931f7eb318d48408c3e2febcc6917c88c8dcc1697cbf4329b1f340d94c35763", + "tests/conftest.py": "fa0ec26667872c9c1011d608310d2551fd24719b5d216f06d923ff4c74c73237", + "tests/specs/exp_ctrl_matrix.md": "5d9dd2e703582572eb68afe3a7096ea43ec82aa03418d20ed283c5365031e433", + "tests/specs/Sah04_validation.md": "1d122d29e281b7f50801b148f3314a0e35fdc27ee7d757c0a661243aa6185fb0", + "tests/specs/sah04.md": "33dbe5e0fd63738abd055c4aa403c191b6de04e6efdbc568f1942c6d23c7459f", + "tests/specs/Kan99b_validation.md": "0d8bf74f2361f863809af1979bf8807adaa423f98321e1104a3d86d8c7a863cf", + "tests/specs/kan99b.md": "b7e0669f0a6b677d902204f3427d1b3ac254bfe70c37d9cf995fb3e8f1fedfb1", + "tests/specs/streakline_notes.md": "cd342d214c07eb608ac2e5b8697322c44c31dbf4d27dfdb5409de46ef474df4b", + "tests/validation/run_perf_baseline.py": "93dde2eb1132f45ea69e1e285ff421dc97a83651a22c79571f299c1909650721", + "tests/validation/run_j1.py": "51b758a271ff358f931b3140a80082294a67e66c2fec0f8c19319e37f92aadc4", + "tests/validation/run_kan99b_rotating_cylinder.py": "323186429a100f36b41ab9b81ade2da6a47e93be3ccb7034a3a6b97f4ee8eb00", + "tests/validation/run_j2_slot.py": "b7d2d3aa06fcafc3ac62ed4a50892afbdb7f86e5720ce75a39ce317b6f571dad", + "tests/validation/run_j3_coverage.py": "329869519b7078e854d96241a7aad8ef93f35ac9be83f0be502c3a93523c3b13", + "tests/validation/run_sah04_st_matrix.py": "9b9c0ce063e07a316846635ee769b837ed26be6bf039f78f4219c10b516f8006", + "tests/validation/analyze_j3_saved_frames.py": "438f67dac682b94c4950626f8de4fdcde48c3a4e9ecf8fdf1b0ada4b6e0e781a", + "tests/validation/diagnose_j3_lags.py": "286fcd65b3261667a847b9b26e213d0af92cf459faa6bbd774f78c8479ce31d7", + "tests/validation/run_j3_reservoir.py": "47535bc3569ce68c888d38978bc4f9077fd763a17829c20c081be52bb18a2903", + "tests/validation/run_poiseuille.py": "e529288e2ffa8e00d281a9006723954d60a96ae4d025e8f28656c09287d4ff46", + "tests/validation/test_sensor_accuracy.py": "c6038a9e7a597a1738814bd15e6ecf357cfd271cdc2a132d47943c5280ac0ef9", + "tests/validation/multigrid/test_cpu_reference.py": "ade5d4827f971aed7174b59d83769e7aa542338e625a9fc8db1e8b1805cb74ca", + "tests/validation/multigrid/cpu_reference.py": "bba2a06a9f6517b32079ffff15e4060d8c3b7ed35f16ca134e1877226c9e4e1e", + "tests/validation/multigrid/cpu_reference_v0.2.py": "b6adbad7da625ef6a6b97958ea9625030ed92676d0cada48e061c87bcf7ca8c9", + "tests/validation/multigrid/test_open_corner_negative_control.py": "59a6f8ca80cdd63cb7827fbebf9b4b555c3793f19dd6bca801544ec10b5cbe1b", + "tests/validation/multigrid/test_refinement_followup.py": "6643e26cd877bf0d0f030e974f00a1d1c0f0350cc76d1c8affed3e8ba2f4393b", + "tests/validation/multigrid/local_stress_observable_v1.py": "0e2777990359a7cf2bb29884173b7b01de37c49bcf49e1f29fc59fe83d62b456", + "tests/validation/multigrid/test_refinement_gpu.py": "0021a39b3a131347196845cff6507c90c387b46b772fe1319d634178c5e13354", + "tests/validation/multigrid/shear_diagnostic_v0_2.py": "a8b1cf2f7abd00efc4d068bbd27bb2317144a6ca4c545d9b2e0dcf421eadebc6", + "tests/validation/multigrid/test_tron_additions.py": "8e7a6a90b85e64c7326719e7b8bca2f6d34fb4c80690f0685f7e291ab93bd2a4", + "tests/validation/multigrid/MULTIGRID_VERIFICATION_STRATEGY.md": "d4f3473da44abee6031a0e1bd4d0ca589077a18f15d2461836e4d2ebb98e458a", + "tests/validation/multigrid/shear_v0_2_evidence/stdout_horsea.txt": "0577df5b3f5cb3c7b6e1ef2de71344f8fd3e6d959117487a06cbaf7f2afa3dea", + "tests/validation/multigrid/shear_v0_2_evidence/stdout_grok.txt": "28ddd1267ca91a772f5a6bfc65d949c9a4ea7dac5c9ba3a0bdb168492810b670", + "tests/validation/multigrid/shear_v0_2_evidence/run_once.py": "6698a2e040c56be949b809387d4518eb0ba82d34cc9d99640da4f8bf3c35c23f", + "tests/validation/multigrid/shear_v0_2_evidence/source_manifest.json": "56fbd0259ff3d4dbd14ace52f64e249a435e9df91732b0e4027def2c344c2e6a", + "tests/validation/multigrid/shear_v0_2_evidence/results_horsea.json": "c2d7ce8d16a0f47baff0788a153353dcf67088da974d9cd3d521b04ecd91ee05", + "tests/validation/multigrid/shear_v0_2_evidence/comparison.json": "41c00372099dd04b6d323785e9eaf4fec09da1753d3d150ffa230800f904142f", + "tests/validation/multigrid/shear_v0_2_evidence/baseline.json": "98a7853341ea732762c7506694e3a867a7259bf110e9e461ea84f741fd9ab829", + "tests/validation/multigrid/shear_v0_2_evidence/manifest.json": "e42aa19e91608164698bea42da88fbbfab8b0f87cc37b27c5baf165453a4fdb0", + "tests/validation/multigrid/shear_v0_2_evidence/README.txt": "4306a34b6896bd6e7a5c2ca71d68e18450359239d0c7ad7a67a4e83e7155959a", + "tests/validation/multigrid/shear_v0_2_evidence/joint_report.md": "1860b8082108c8b8a87998af90cd0b81dce1c04e9f6c67b41e0912f9fef6cc9c", + "tests/validation/multigrid/local_stress_v1_evidence/stdout_horsea.txt": "882f2cfb1dbdf82cce63c011397e7c2e6307bbcfec42a3510648d328cd6ddcfe", + "tests/validation/multigrid/local_stress_v1_evidence/run_once.py": "e629800291ef65ffea8555f66ec80bf15200552540b2a493a677bfb53d0830b3", + "tests/validation/multigrid/local_stress_v1_evidence/source_manifest.json": "d2cf90b73458f493c665c9a281d06aef0c190cf0d143639fb77ab838c78f020c", + "tests/validation/multigrid/local_stress_v1_evidence/results_horsea.json": "f17b4644d19eb75d55deb7021ab679cb9e7922a2b46f1cacf8b6da6bfb9a2690", + "tests/validation/multigrid/local_stress_v1_evidence/comparison.json": "be236671a501c31c06f7e266f6e0c0c2a89aede321a483452050ff37bf84c84a", + "tests/validation/multigrid/local_stress_v1_evidence/baseline.json": "64f6541447afbd15b1b15d802ad6f1b5042aaf84e7d4d2414e4ed4c52cf70507", + "tests/validation/multigrid/local_stress_v1_evidence/manifest.json": "3a9fa8c7d691c1b8c24f05940eb724d30b890dd8ed636551068d2633d7db2f70", + "tests/validation/multigrid/local_stress_v1_evidence/README.txt": "4f62314876047ee437bb9ecbf84798d2a9f6e85f6a3aef260277b85bcdb35fae", + "tests/validation/multigrid/local_stress_v1_evidence/stdout_local_stress_observable_v1.txt": "6a826e5ad729ce45af6879a07a1c659d8b4a21403fde5b9c6d9696cc6a5b09d4", + "tests/validation/multigrid/local_stress_v1_evidence/TABLE_local_stress_observable_v1.md": "d8ff0568d9c473a4bb09396a8948ddc8dc5af2f0f3a23ac84d238814fc779501", + "tests/validation/multigrid/cpuref_0_3_evidence/stdout_horsea.txt": "457f1d2173496554c87ca6e61df518c0b8f1e0a28cdfd94b94ebbb61bc459d70", + "tests/validation/multigrid/cpuref_0_3_evidence/stdout_grok.txt": "73e4ef01138842981daaa534390f1463839e63833c11f4e8872f94f8eaadc717", + "tests/validation/multigrid/cpuref_0_3_evidence/results_horsea.json": "914389afc39752bcd4132aa21fc8d5cbcf0ca75b1efd6a49becab15c2fa3361b", + "tests/validation/multigrid/cpuref_0_3_evidence/baseline.json": "0daaccee41cabeb17a00e2405e2c7fd0b80d36f2d01778eb39c9fd22b13d2d47", + "tests/validation/multigrid/cpuref_0_3_evidence/manifest.json": "2850ecaf2e19d010ba35eb54162371d82cc1a092831e08a03b6adf75a614988b", + "tests/validation/multigrid/cpuref_0_3_evidence/README.txt": "1947ee0232b88b3cc2c506d0b0af5ba051ecc94aa8f7f09228ef3939cc95919b", + "tests/validation/multigrid/cpuref_0_3_evidence/README_grok.md": "065947e15b2242bce7d3eb05a3acdbb59939c621dcd5d31540ad4a1bd4416818", + "tests/audit/\u5ba1\u8ba1\u62a5\u544a_kernel_layer.md": "89893c98ed7c2699157bf728ec0e79b0dd6aff4008ee5c7b77eb052de24033f1", + "tests/audit/body\u91cd\u6784\u7b14\u8bb0.md": "8f978d7b01c9f49dca9eeaff0d163cec6da085e2f99ee5a5e803d72306e7a72f", + "tests/audit/\u517c\u5bb9\u6027\u6d4b\u8bd5.md": "9c1721a33b381b9c3810545772b022913da06617711b5ba13a3c2c991b81a7f7", + "tests/audit/Force_region.md": "3092080afe4a30665fe1b721803621ba9d0dd5d20ad17826984d94efc160fdac", + "tests/audit/\u5ba1\u8ba1.md": "0f14ad073a0725134e6391f961c324fd0013c7791fd410713e94ed1ad40b7385", + "tests/audit/Force_region_validation.md": "279a4484d1bfca0fd67aed4de3282d547aa048f89389420d8e5f2fd86db54fc2", + "tests/audit/body\u5220\u51cf\u529f\u80fd.md": "e9f308a8cd0f0e7df5441c32a15f84c0bae50bc0e56b8728f6c6f2cf78596673", + "tests/unit/test_initializers.py": "8b4e3358d925614984265ae73c142006b48fd1c3918cf84901f18afd9fe68c3a", + "tests/unit/test_simulation_lifecycle.py": "77abdc33218c35e9c8b62dbd99ceddbaccd8417e7f0b539ea8859ea0175c663a", + "tests/unit/test_numerical_operators.py": "6d1d560ef553a2af7adac7db3e325d96d7fe39073d5fe3e0e982439537385b27", + "tests/unit/test_sync_plan.py": "983313ef783143231fa5a392f85f3bac011184773ccaf5d946504c206cabb721", + "tests/unit/test_surface_actuation.py": "89be6f54c4eba6c2bdca0d287a5b9fa6db143de2bcd9a671d4fb8445921303ed", + "tests/unit/test_state_regressions.py": "0f69cfeb83428192f95688c76abcae7e5b9cf5f27c52bca4ac20c7f320044374", + "tests/unit/test_equilibrium.py": "1ecbcc4547b1c846b75320463d828d6a36b6aae73208084fae476b1001c1bb50", + "tests/unit/__init__.py": "17f57920d9c1ff46096ceb2af008eb38c4b98dc81ffa3c3d310e758e80ca1cd4", + "tests/unit/test_pending_edits.py": "905a0dff23b123e8e38aaf364984c810fe51c39acd64aa271e343a4701d3d024", + "tests/unit/test_planar_velocity.py": "b656da0880b4234b1db805544edbe0d2473cbcc7c2c869c71d8251337f62a982", + "tests/unit/test_body_flags.py": "ac6409157924e15a13a3d2cc2f1a09014b8b0198ba17c824f412ff20b19e2aac", + "tests/unit/test_build_contracts.py": "7bb237425e8bb481f312fa4841c484e280731e13c7cbb9a53dad3e7f98984ac3", + "tests/unit/test_context_ownership.py": "299fed30dd0f9bd4dadd8b27f50df2a6367bdb0ab2ca3f391f215fde7241f35a", + "tests/unit/test_reservoir.py": "e718c78a53c3941aba7feb8ae4e8bb0b1726c1145de84febf91220c1917991c9", + "tests/unit/test_refinement.py": "90751142f920f1c5e988577a45afa94871a6617009cdc78323a87fc7795f4634", + "tests/unit/test_slot_velocity.py": "6a9494de9a32c350389ccbed58af48951f6b25a21a258537d2e8b73eb67cb11d", + "tests/unit/cpp/semantic_regression.cpp": "99dba074c0c0a32ea76026e7d54fc60af8e6d3dc5315c8900c470b4518878f39", + "tests/unit/cpp/reservoir.cpp": "c3eacaf0271400eb45ad559b571a8f7faa2a809d5f1857ffeb5592addce2cd0c", + "tests/unit/cpp/collision_regression.cpp": "f17acdff74ab82a62dc5402b42e3f6a149c262e89b140494164d6ebd630f5e14", + "tests/unit/cpp/slot_profile.cpp": "31ac58ccab175bf79fa59fc46d4c0842df18ab0a5e5916be84760d9da2b75788", + "tests/unit/cpp/planar_velocity.cpp": "8dea266984edc69d4e0e68007e038d7a587e99f84e33478d6656a66a56680933", + "tests/integration/test_body_sync_e2e.py": "d29f01771f3512a4b3ad06fae4ee952327d7fd9f0476942402fe92e9e327fcec", + "tests/integration/test_sync_bodies_skeleton.py": "65f55a0980659b49ae0027f0642a27e2ebaead226ef083f233e878150884b07c", + "tests/integration/test_numerical_gpu.py": "002a6745929bd5ee86a9491ea9bc3f97602fb825ea17262ea190c9311881100e", + "tests/integration/test_ddf_patch.py": "dda2abba32ca13e17098232f2831a0b1b66439c35f8931d9997a0257250c1281", + "tests/integration/_cases.py": "ab76ca1096d2d10fb05b3539aa8ed3c7e549619bae6900ac98723f6c3c908f2d", + "tests/integration/test_surface_actuation_gpu.py": "3c2b4dda70db1d6493ecd92bd9b0dad6d8b438cdf6dca46410018217f8beb4da", + "tests/integration/__init__.py": "c354e43ba09b55a8013a2df2069438740b5f48b5917d855e52e33ab5d7da5a6c", + "tests/integration/test_state_gpu.py": "dde0948941e8abbc5ea10a3acb3a35abbaea576f36ecee0f1120fbcf7454d60b", + "tests/integration/test_runtime_contracts_gpu.py": "775e578e2e8072af32fc740b2698abbb79454235a0f3ee929ac4c75d747f8db5", + "tests/integration/test_unified_obs.py": "4a681536099741d92bdc258525fe3374cbdbeba0d49996e53808381a1b6a13fa", + "tests/output/exp_ctrl_matrix_streak_ny300/summary_C4_deceit_f1p5.json": "11dab8440d8c4f385061d2536403f4313c6f026b4e0b7672681327a9f4f37ebb", + "tests/output/exp_ctrl_matrix_streak_ny300/summary_C6_deceit_f2.json": "e0c4e8bcc55da5dc8de1e2fe88029aa3e67453734faa44451f5a6dfa9131557f", + "tests/output/exp_ctrl_matrix_streak_ny300/streakline_C6_deceit_f2.png": "e0a66708ce2a29c4c6b854d2596b3ffca181dc6e35d99cc94e08af3e2d8c024e", + "tests/output/exp_ctrl_matrix_streak_ny300/summary_C3_deceit_multi.json": "24c8e433aab6d207dab67546c4079868c4244c2948c32c94cd08e4f331991807", + "tests/output/exp_ctrl_matrix_streak_ny300/summary_C0_no_ctrl.json": "cf3af733a08f081cc5f879e8da79d7c60104099f4452af5b2a4a96c0e6bd5889", + "tests/output/exp_ctrl_matrix_streak_ny300/summary_C5_deceit_multi_f1p5.json": "a4cb4ff4481b39b9ee61b1d7209416237a7fe86b22c5068d713ccec9c3f7afe4", + "tests/output/exp_ctrl_matrix_streak_ny300/manifest.json": "d8a20dacc92321d98354684976f771a9ca8989fc63ddcd78e15c7768c6617671", + "tests/output/exp_ctrl_matrix_streak_ny300/streakline_C3_deceit_multi.png": "c6fed617cc6ffe6677157a9b58811d5f4613725eb98a5aec830fd07dc1aac38e", + "tests/output/exp_ctrl_matrix_streak_ny300/summary_C2_deceit.json": "7526a6b20a158461b85b1a64070b46c2b21be1e01c5ee025e6746fcf47ea3397", + "tests/output/exp_ctrl_matrix_streak_ny300/summary_C1_stealth.json": "63d34a0ab33e9fa8fe7311363efbd1b2875691f5b4958bb645b8c7ac38f1ad6b", + "tests/output/exp_ctrl_matrix_streak_ny300/streakline_C0_no_ctrl.png": "0cfd7ce8f9d743bf22a7a694b4e5a3616557cb8f1db2f4ddf49cc4bef96efef2", + "tests/output/exp_ctrl_matrix_streak_ny300/streakline_C4_deceit_f1p5.png": "4dcfc186928dcb83d28e9eb4cb2ecb4b163eb6f121d57036b4c05ab162be0951", + "tests/output/exp_ctrl_matrix_streak_ny300/streakline_C1_stealth.png": "5e3cbbefda06fcef243d7d06d74a473972350cfa4ae88bdfdb349dce13943151", + "tests/output/exp_ctrl_matrix_streak_ny300/streakline_C2_deceit.png": "22f1db77499bdbd1b3cd35f5b58b1a884dd94a86fdcfef07abd4157e6aaf8d19", + "tests/output/exp_ctrl_matrix_streak_ny300/streakline_C5_deceit_multi_f1p5.png": "823e475cc901af3d6f4d0c56eb07822b3e73a2b9d0aa23e20e3741023fe90092", + "tests/output/kan99b_validation_esopull/summary_runs.json": "fe3294a953580204319fb1143434e15096d8455b6073100dfe0d5491b76af394", + "tests/output/kan99b_validation_esopull/summary_runs.csv": "1a44bb27ee0a7fe0270905248c37364834248cdc8710bd68142a6a79bbdad82b", + "tests/output/kan99b_validation_esopull/force_csv/k2_k2_inlet_control_domM_re100_a1p000_zou_he_local_mrt.csv": "9fbc7d507c129ed85c68a9a313e3eb3431470d091bd7723e63f8afd8a3d2b737", + "tests/output/kan99b_validation_esopull/force_csv/k2_baseline_domM_re100_a1p000_regularized_mrt.csv": "8faac43f42d6e0c70085c6e616bfff4df8de897e315fc0d2b4aa8bd635c3fa05", + "tests/output/exp_ctrl_matrix_vort_nx1500/summary_C4_deceit_f1p5.json": "b613ae55fcfbd45a1a922d6d529e5274ba9d2987fdf5620fe866b889b931e48c", + "tests/output/exp_ctrl_matrix_vort_nx1500/summary_C6_deceit_f2.json": "dbf54f9a183072547b22fa14334f0167e6eefb21c1208c4e8584bc196545a399", + "tests/output/exp_ctrl_matrix_vort_nx1500/summary_C3_deceit_multi.json": "2100c6cc5c358a249804ce8f6f98531f3bc868e27af6d21a9d441b1b6a9e479e", + "tests/output/exp_ctrl_matrix_vort_nx1500/summary_C0_no_ctrl.json": "a8b4697b7c0caeb958f80e282e32d673deac8c914008d64e6b38f7883eacc57e", + "tests/output/exp_ctrl_matrix_vort_nx1500/state_C6_deceit_f2.h5": "8d0c28566d2230b422691b738cc453705496bd150be038a576c0c0fba218fc1f", + "tests/output/exp_ctrl_matrix_vort_nx1500/state_C5_deceit_multi_f1p5.h5": "608767ca11d104fa4506b57204a0c8dbd739688224ebd924fe517ce9e21db823", + "tests/output/exp_ctrl_matrix_vort_nx1500/state_C1_stealth.h5": "a83c988cc8b1173a7b2f13b132ed7243e98304dccab2965aa16cf4d32f8df007", + "tests/output/exp_ctrl_matrix_vort_nx1500/summary_C5_deceit_multi_f1p5.json": "6f6b9300782178e0ac9308a677bd9cb1565a383a78dff4cd52dea0bd464db31d", + "tests/output/exp_ctrl_matrix_vort_nx1500/vorticity_C6_deceit_f2.png": "21bbe2dac1ab06ca1b172ec62d00daa7bcd65d99adac0ed03c5e30bed59e871a", + "tests/output/exp_ctrl_matrix_vort_nx1500/vorticity_C5_deceit_multi_f1p5.png": "602a6586277699968b4cb167b134c8c406577038af088aa70baff682691398c4", + "tests/output/exp_ctrl_matrix_vort_nx1500/vorticity_C1_stealth.png": "c1e1d04f266deac5fb2815a8283da80f9139ffaccbec2219d98544296bf3152c", + "tests/output/exp_ctrl_matrix_vort_nx1500/vorticity_C4_deceit_f1p5.png": "96dee924e89b90091192a8d7b43321f109a5491511b8a83da77cfc611ae0d93b", + "tests/output/exp_ctrl_matrix_vort_nx1500/state_C2_deceit.h5": "aa5800a0cd594eeb7cf5449d6469d55e0c9033ced0ee0a3b5d59152e68c7e263", + "tests/output/exp_ctrl_matrix_vort_nx1500/manifest.json": "5d28f0f5428d7f0341e20d5d1f19c17bbc6f0f9b2a441d3c95f5422f3f2b4bd4", + "tests/output/exp_ctrl_matrix_vort_nx1500/vorticity_C2_deceit.png": "1dcb6fb959f944d7ad89c4abaaef4d1fd4a77db8901804530e86fb336b883eb5", + "tests/output/exp_ctrl_matrix_vort_nx1500/summary_C2_deceit.json": "b88ff5049aef59876b349d105f1c3467c17c9ba9022a48a77a6984f20da34345", + "tests/output/exp_ctrl_matrix_vort_nx1500/summary_C1_stealth.json": "515689cbfaa30a9e39d9907939ee194a4836b644a5e9124586e6b7221d2b394b", + "tests/output/exp_ctrl_matrix_vort_nx1500/vorticity_C3_deceit_multi.png": "d69694a1a1b2f2ea0adc7b74b7526504e2ad0b5d6317bac9b3159b2e7e88cf90", + "tests/output/exp_ctrl_matrix_vort_nx1500/state_C0_no_ctrl.h5": "3a858d6be0a946e1d26bbfa192c2f0ca3910c0f140b42575ec9d9529dd99155a", + "tests/output/exp_ctrl_matrix_vort_nx1500/state_C4_deceit_f1p5.h5": "660e4619ea530dcd18c3afb2e7fa22cafd9cdba1be7888e31ab5b76a0902d2fc", + "tests/output/exp_ctrl_matrix_vort_nx1500/vorticity_C0_no_ctrl.png": "6d4d3934f1c8b20c2a5c742ae080a7143f0c139741966adf009a227c27e9bb1f", + "tests/output/exp_ctrl_matrix_vort_nx1500/state_C3_deceit_multi.h5": "1e72126f11b2995437cecb8cc0eeffb8807efbfa43d8f346f28711fea98ddc90", + "tests/output/kan99b_validation_ref/summary_runs.json": "449316c30585a8de9997538dead5d4e35a59bf00a2ac22d01b101ab600a4bc06", + "tests/output/kan99b_validation_ref/summary_runs.csv": "e8b9620f3772e5e421026103e456e6e844a91292f40affb96174c9dbde9b6e4e", + "tests/output/kan99b_validation_ref/force_csv/k2_k2_inlet_control_domM_re100_a1p000_zou_he_local_mrt.csv": "4391f41d17ebeea1092f13b901923ced4ee2a1c5b346b79ef791d692847286b5", + "tests/output/kan99b_validation_ref/force_csv/k2_baseline_domM_re100_a1p000_regularized_mrt.csv": "105c6eb21f1943d9d935246eab1602ff2016c415a139e24fee2793e88e006ead", + "tests/output/exp_ctrl_matrix_vort_ny300/summary_C4_deceit_f1p5.json": "0085a679a423621003eea81d4ac83bfe2edef2879eed7809d2a3675a212f791a", + "tests/output/exp_ctrl_matrix_vort_ny300/summary_C6_deceit_f2.json": "e820cf73f0e90bf93c34b24416e7692a6c2e51352ccf490fa6714d0812331ca2", + "tests/output/exp_ctrl_matrix_vort_ny300/summary_C3_deceit_multi.json": "571370c74ad9af589f3dc214669bff3d857efe6fc4fa13815b5d793d12b53770", + "tests/output/exp_ctrl_matrix_vort_ny300/summary_C0_no_ctrl.json": "ec5b89961033d8ebe0d66ce1ec7940dc2faf98130c38319bc9984ef654e60b50", + "tests/output/exp_ctrl_matrix_vort_ny300/state_C6_deceit_f2.h5": "2792be74d8564fa29fd0636fc8493630fba2779c165b44330197095b3e296b18", + "tests/output/exp_ctrl_matrix_vort_ny300/state_C5_deceit_multi_f1p5.h5": "2c64ee6c7a4ea2c42ed8f3d274402bec62de0e02ea0340e16022f0cdc92af724", + "tests/output/exp_ctrl_matrix_vort_ny300/state_C1_stealth.h5": "100727d94fe6c2e46d7807eed0442555bdd1e26ec9b04b4c457171a2bbba3255", + "tests/output/exp_ctrl_matrix_vort_ny300/summary_C5_deceit_multi_f1p5.json": "f86166f121b4eeb6d74d8176c9265e7a3ccfe2540d040f554b6f96e6a6222c16", + "tests/output/exp_ctrl_matrix_vort_ny300/vorticity_C6_deceit_f2.png": "fef4de0e3ac8203742f35c16a02445b19c3f556b11f73abd5d8e3ca05ca33d78", + "tests/output/exp_ctrl_matrix_vort_ny300/vorticity_C5_deceit_multi_f1p5.png": "9136448e6d7565ca5af3666f9cf6e154342d8a3475076abfdbdd1ff9faec34f3", + "tests/output/exp_ctrl_matrix_vort_ny300/vorticity_C1_stealth.png": "544537a9c500a05937fd3be17c25e7d887461d9b83a15564f9ab7063208f40f6", + "tests/output/exp_ctrl_matrix_vort_ny300/vorticity_C4_deceit_f1p5.png": "51e7056db99dd653affbe913d52fa41df6ec0db921109384e3c679bda06b5a83", + "tests/output/exp_ctrl_matrix_vort_ny300/state_C2_deceit.h5": "39d6c162085acae1612650da37d2314757715931e83a854e08bb01407d0f8efc", + "tests/output/exp_ctrl_matrix_vort_ny300/manifest.json": "05fbc2e7bbad4267a38e1094bbdd6bee6ad270412bdb5e92b0dfc9fa56969517", + "tests/output/exp_ctrl_matrix_vort_ny300/vorticity_C2_deceit.png": "07fc5817eba30371272b87ee2e023c0a1144077d1bef77efb2fd5dc284badcb7", + "tests/output/exp_ctrl_matrix_vort_ny300/summary_C2_deceit.json": "b1fcf76039c91a9080b830352dee2e95316d754b968cc27a8f68c51527661e76", + "tests/output/exp_ctrl_matrix_vort_ny300/summary_C1_stealth.json": "b78851637b9b7b93070524a2933cae1dab6d682f8894579b2849c64921e6c29e", + "tests/output/exp_ctrl_matrix_vort_ny300/vorticity_C3_deceit_multi.png": "2658f0747ed7287f7912fe15cc58a086e01ba284277cb98689bac01ecb6ec12b", + "tests/output/exp_ctrl_matrix_vort_ny300/state_C0_no_ctrl.h5": "57f73f5f8dc4b32b156bc82300b1efd1e4eddadd9b8dc51cb7e6b41fa5c966bd", + "tests/output/exp_ctrl_matrix_vort_ny300/state_C4_deceit_f1p5.h5": "2864b9dd086709ee8b8c3f262118a5130b0d40c86838f3ca0deab5bb898dafa8", + "tests/output/exp_ctrl_matrix_vort_ny300/vorticity_C0_no_ctrl.png": "2c7f3a8be2ee540afdfb66299e43a65583434bee84bde590124524a82868c900", + "tests/output/exp_ctrl_matrix_vort_ny300/state_C3_deceit_multi.h5": "39e0d9b032dfff8cf057b410a98973729285e7d03e89f9a6a002aaf7de3d7519", + "tests/output/stealth_sweep_fix_check/summary_stealth_s150_w0.02709.json": "8b1032e13975bb05c6a810fde175c8da51bacdb3dc745fd11c1049ca63bbf136", + "tests/output/stealth_sweep_fix_check/summary_stealth_s050_w0.00903.json": "fa7da24d5dab9fd3a3c2dea6b50d0224c7a99cd9141796e137304a6040b1ac8a", + "tests/output/stealth_sweep_fix_check/streakline_stealth_s050_w0.00903.png": "640928f7eb159e7caea32036123f86c281723d083cca46839ba86bce8361ada7", + "tests/output/stealth_sweep_fix_check/state_stealth_s050_w0.00903.h5": "187ac365f9f7370c888c4c65570c47e42465b2fccd432056c176528d45cf0c2f", + "tests/output/stealth_sweep_fix_check/manifest.json": "83a3f12a942fb644e470bd07a72f24921f2147d7df429110268c5c96a9953d1a", + "tests/output/stealth_sweep_fix_check/state_stealth_s150_w0.02709.h5": "e057e9db26b2546c0704e2c959cc7d2aac91e6a49b4c7ee75a409597a5db8716", + "tests/output/stealth_sweep_fix_check/vorticity_stealth_s150_w0.02709.png": "d2d202088624cf30868228f9c913ee30e1b386aaa2c22b0ea89be43dedc0712d", + "tests/output/stealth_sweep_fix_check/streakline_stealth_s150_w0.02709.png": "0edc7caa9caaffb754490bf1f6ac7ad7180e45a991439a3f4f83ed949a082a1a", + "tests/output/stealth_sweep_fix_check/vorticity_stealth_s050_w0.00903.png": "4088359b17c46ed4d7c8401d244808fe67723273b1d16d0671b69f9478c68c1a", + "tests/output/final_validation_round/validation_summary_report.md": "881cb7052e5a555afc87168a37268ee66e8e3fba172533706e858d996fabc7b9", + "tests/output/final_validation_round/sah04_mixed/s2_d48.json": "83c6c01201d90aae5c49e73ebeca88d1c7ded6cc83c13f4892a9188e6289483f", + "tests/output/final_validation_round/sah04_mixed/s4_reg_d96.json": "b32f03e6b347fc709cea2ecd488df0f85849c733bf6a4b9cf65ea69401c93a1d", + "tests/output/final_validation_round/sah04_mixed/s1_d48.json": "120e8e878f5712dc89b7cf78c7f8d0e3368d34ad5ef7494977e083b188a54c18", + "tests/output/final_validation_round/sah04_mixed/s3_stablecfg.json": "b38a3d197a188e65c163d974113af18f332b3abed083e2654e998d9980f6be9f", + "tests/output/final_validation_round/sah04_mixed/vorticity/s3_mrt_laststep.png": "dc96fcd05d458684cfb40d4cb741172213083e2f2665e2bae7e1f0267bb3575d", + "tests/output/final_validation_round/sah04_mixed/vorticity/s1_mrt_laststep.png": "73a3580ba3c7fe6ffeee4676a9a51b5bf678d6fb523456a61e185598389ea1e1", + "tests/output/final_validation_round/sah04_mixed/vorticity/s4_mrt_laststep.png": "57f2a82761f2de1a9fc2b78ee86159ca542c966494b9c704deb451da857da778", + "tests/output/final_validation_round/sah04_mixed/vorticity/s2_mrt_laststep.png": "786f492b96ed932254b5452e2d06ff088727f2d88c7e7c7b47d386eddfe07862", + "tests/output/final_validation_round/kan99b/full_summary_runs.json": "8c4a11cbf555e08a66698439170b850c57d537d8e75e4dd75beb767bbf7e38cf", + "tests/output/final_validation_round/kan99b/summary_runs.csv": "3fa92fdd3114f0472de44bc03006af1d4b694dfc69b06704c1667cd3627b6dab", + "tests/output/final_validation_round/kan99b/force_csv/k5_baseline_domM_re160_a2p000_regularized_mrt.csv": "de05e9699146f2adffc9d7c9991f9e48396aacd142afc3c08b2b64727c83c69a", + "tests/output/final_validation_round/kan99b/force_csv/k3_baseline_domM_re60_a1p600_regularized_mrt.csv": "53cd0dc47328b7b370eced1130508655e6815a29b727bf1fe4e4e125e4918905", + "tests/output/final_validation_round/kan99b/force_csv/k2_k2_inlet_control_domM_re100_a1p000_zou_he_local_mrt.csv": "4cac1ccfdb7451de3e26d921a6406cc55d1d4630e10ec0d7ec9350a4abd49404", + "tests/output/final_validation_round/kan99b/force_csv/k4_baseline_domM_re100_a2p000_regularized_mrt.csv": "392c98de52011ddb344a5761c4520e870f4e49bbba3e144e5a02818ba2f9250b", + "tests/output/final_validation_round/kan99b/force_csv/k1_baseline_domM_re100_a0p500_regularized_mrt.csv": "9e83c5175aec644c0b97c081e610deefa731b87aef04da6297abf662a71c0702", + "tests/output/final_validation_round/kan99b/force_csv/k2_baseline_domM_re100_a1p000_regularized_mrt.csv": "55b071f278e153aa353aa2bef85f0bce35b910a7b08103032023fe3a28169b89", + "tests/output/final_validation_round/kan99b/vorticity/k2_k2_inlet_control_domM_re100_a1p000_zou_he_local_mrt.png": "b91b332e7deb787975d3f08fa3325facd4a972b536694fcda52e6c01943c42cb", + "tests/output/final_validation_round/kan99b/vorticity/k1_baseline_domM_re100_a0p500_regularized_mrt.png": "6e7c3f6567c0ff0d00d75da8373031f5ba2a17a624cb8c5d5d6ae4f8749c33c0", + "tests/output/final_validation_round/kan99b/vorticity/k5_baseline_domM_re160_a2p000_regularized_mrt.png": "c4d232df2e6f7466acca711191d976aa9411ec0ade81572b531463f42a7d633a", + "tests/output/final_validation_round/kan99b/vorticity/k3_baseline_domM_re60_a1p600_regularized_mrt.png": "b2314c60491d20933422e1697998555dec2436d39545c71f990e9906884685b2", + "tests/output/final_validation_round/kan99b/vorticity/k2_baseline_domM_re100_a1p000_regularized_mrt.png": "2b2797b8f53170d04d1a70d1cdf898f7e41b3a76b9f3c1f276dfec952520ab04", + "tests/output/final_validation_round/kan99b/vorticity/k4_baseline_domM_re100_a2p000_regularized_mrt.png": "8135f470404fe11ac97968fa580ee35232e90dcace3c6ad94de17ef7aace24d6", + "tests/output/kan99b_validation/summary_runs.json": "d7239aac64884202558741074f2d644ade9e2365d94d0b7556fba68dac94868d", + "tests/output/kan99b_validation/summary_runs.csv": "c44da69563d58b917291a9fd402d1f57055861bffab6f9e32d7db91297428d45", + "tests/output/kan99b_validation/force_csv/k5_baseline_domM_re160_a2p000_regularized_mrt.csv": "27b64460923d235d34b760f2a2371ad01611a70e38edb03d6fd6a2fe7a7de6e0", + "tests/output/kan99b_validation/force_csv/k3_baseline_domM_re60_a1p600_regularized_mrt.csv": "76ff52f4494b7ef7650c05968732a8caaba94d2b151234c02cf624f5b3a712ab", + "tests/output/kan99b_validation/force_csv/k2_k2_inlet_control_domM_re100_a1p000_zou_he_local_mrt.csv": "28a83436ca8bdad38865ba21ce1bda679562a5ae1cfc6ee8fc6e86ff760ec66d", + "tests/output/kan99b_validation/force_csv/k4_baseline_domM_re100_a2p000_regularized_mrt.csv": "823ae04870fd951879024a18169ac5cba8db4b3201726f6a00f320f1958d04c6", + "tests/output/kan99b_validation/force_csv/k1_baseline_domM_re100_a0p500_regularized_mrt.csv": "a591daf2cdecd6ac3689fa2a2aba917b23053ad26e3ef1f635c81aecc451475f", + "tests/output/kan99b_validation/force_csv/k0_baseline_domM_re100_a0p000_regularized_mrt.csv": "e95c27c646c0c9baf8f455f876c115c8dbdb23cef9d9d550f455098bf0c03b55", + "tests/output/kan99b_validation/force_csv/k2_baseline_domM_re100_a1p000_regularized_mrt.csv": "3c2ea79a0e27f561215febee2e165d24b3617a648bf908981c068ba59d549c51", + "tests/output/stealth_steady_sweep_nx1500/streakline_stealth_s125_w0.02257.png": "a892f18c74fe13efd839bfd5068097ca0ae07acebf6c06eed89e1b867e41fcb2", + "tests/output/stealth_steady_sweep_nx1500/summary_stealth_s125_w0.02257.json": "7e542f59746429022ce1794854c6fb36e8ac658dd0aea3bc1140a45e83a3f1c9", + "tests/output/stealth_steady_sweep_nx1500/summary_stealth_s100_w0.01806.json": "b76216e0fbee00ef754edbafe5790a99ce7d53638af629947ddd9615598e4c08", + "tests/output/stealth_steady_sweep_nx1500/summary_stealth_s150_w0.02709.json": "42cb241d9cfb01308ce28e129756b6cb3fe2a8e9679518da84bcb8b607fe92ac", + "tests/output/stealth_steady_sweep_nx1500/state_stealth_s075_w0.01354.h5": "558be308dbf334832bc1d29419ba5be142969117a11b124864f6b221c8fee509", + "tests/output/stealth_steady_sweep_nx1500/summary_stealth_s050_w0.00903.json": "53b579811a0b651ba7cc466c230c115b9f88486c6675e0465d0715d3377a75cd", + "tests/output/stealth_steady_sweep_nx1500/streakline_stealth_s075_w0.01354.png": "9f4a7d89b2471becaf31e84c14402441c5fd96fc7190cea5e8a9fdd06ee62002", + "tests/output/stealth_steady_sweep_nx1500/streakline_stealth_s050_w0.00903.png": "5f18f56b0ff2af3350216b65540a2bc664c569520624cfc6cc2439a3c5369560", + "tests/output/stealth_steady_sweep_nx1500/state_stealth_s100_w0.01806.h5": "30776f333959e0e9eb5ca96b269e6a8052c5b94941a4e3b36d8a6af8076920ce", + "tests/output/stealth_steady_sweep_nx1500/vorticity_stealth_s075_w0.01354.png": "b5393474d99191e88dafea4144b6a8eccfbdf75107125ce4b05383b17007d06a", + "tests/output/stealth_steady_sweep_nx1500/state_stealth_s125_w0.02257.h5": "4ed9d8587f75ad4625ec5501fa99fb733cde037180ac53f92a210ffbb08375de", + "tests/output/stealth_steady_sweep_nx1500/summary_stealth_s075_w0.01354.json": "ff1c1cc649e589b5425787493c2b0d04b6c39b43043b1968d65509cb0a426e82", + "tests/output/stealth_steady_sweep_nx1500/state_stealth_s050_w0.00903.h5": "4de51584b24095f8cf4480b8941593a5f913332f9396061ed077c9d49eb2ee11", + "tests/output/stealth_steady_sweep_nx1500/manifest.json": "0dfbb2c1b5bf9093fef169e4dc6319edb5c87a1e967e8d558613e2c64a2ca734", + "tests/output/stealth_steady_sweep_nx1500/vorticity_stealth_s100_w0.01806.png": "60824cbdf21170cb4ffd8af0a49e8522c2d79cb2694690ab67995ee973265efa", + "tests/output/stealth_steady_sweep_nx1500/state_stealth_s150_w0.02709.h5": "b22d54a05cbd3138a1fe585a825246989fcff7c00f51aa9312a4185d963db933", + "tests/output/stealth_steady_sweep_nx1500/vorticity_stealth_s125_w0.02257.png": "c1e1d04f266deac5fb2815a8283da80f9139ffaccbec2219d98544296bf3152c", + "tests/output/stealth_steady_sweep_nx1500/vorticity_stealth_s150_w0.02709.png": "bcf098083a73798dc3906807218058cc571435a010234a5a350b585ba9915c78", + "tests/output/stealth_steady_sweep_nx1500/streakline_stealth_s150_w0.02709.png": "3bac21cc75a01429399cec308d6bf5fc8918917def1bf5d7fec1cb6003390a41", + "tests/output/stealth_steady_sweep_nx1500/vorticity_stealth_s050_w0.00903.png": "a675f41df763f0a1ac0a06386315806b24f2571f5dabc8693fcd871a13ed22ba", + "tests/output/stealth_steady_sweep_nx1500/streakline_stealth_s100_w0.01806.png": "92515588596596cc1d691c643fa48cf828492c2eaed96355dcec58109de4b5aa", + "tests/output/exp_ctrl_matrix_streak_nx1500/summary_C4_deceit_f1p5.json": "0393661f08b748428fc366eeecec3b34b9d9a013aa6b151a15b33c7e3c0e1818", + "tests/output/exp_ctrl_matrix_streak_nx1500/streakline_C5_deceit_multi_f1p5_step080000.png": "bffef412087e426b614d8c05e59bd7580ee49bb77319279ddc4c1bf825678c49", + "tests/output/exp_ctrl_matrix_streak_nx1500/summary_C6_deceit_f2.json": "de067f01ef5c11249d67bbe5e02db6f2b4c5590214de02609bca115edf8dee64", + "tests/output/exp_ctrl_matrix_streak_nx1500/streakline_C6_deceit_f2.png": "846badbae81b75f765d89e5a7c4f88aeb5d57f2387511e4f2f84c72a192ea9f2", + "tests/output/exp_ctrl_matrix_streak_nx1500/summary_C3_deceit_multi.json": "eb21d1c69e51f01c1a6be1ce59fe86763089ea5aa667b8872d0186af035b24b2", + "tests/output/exp_ctrl_matrix_streak_nx1500/summary_C0_no_ctrl.json": "780a0d329cb86990a17a088f49084410abb1fad24f659255918e5ddda6b3dabd", + "tests/output/exp_ctrl_matrix_streak_nx1500/streakline_C3_deceit_multi_step080000.png": "ff7836b8229d9a5dd3900f499fe3e7f0c73a61c7109b6e6e79b11a0fb459bb63", + "tests/output/exp_ctrl_matrix_streak_nx1500/streakline_C0_no_ctrl_step040000.png": "f2b56a7e30bcc363ed69fc19705403181ac5de90800eef03039a389a65869e30", + "tests/output/exp_ctrl_matrix_streak_nx1500/summary_C5_deceit_multi_f1p5.json": "261b698723f19526a447679a2be8666c8d0cbf6df81b0c9de6d051960d77308b", + "tests/output/exp_ctrl_matrix_streak_nx1500/streakline_C0_no_ctrl_step060000.png": "0697e0ae06a01154afdcf00330ba870bd8f36d21561a33846ad7ba63fb731179", + "tests/output/exp_ctrl_matrix_streak_nx1500/streakline_C1_stealth_step040000.png": "1de3d7f54e91c5d5850f4358d1872e16fefb36d32a1b6293facb54524e32315c", + "tests/output/exp_ctrl_matrix_streak_nx1500/streakline_C0_no_ctrl_step100000.png": "91f0bf6ed3e854f7f83623a3f19bb12c83b4aac239e3eaa849fbe50e7baddff5", + "tests/output/exp_ctrl_matrix_streak_nx1500/streakline_C0_no_ctrl_step080000.png": "303c1d2d4c49b4a7495365c8cb2bcbfe9bdda7cbc0a7c7dd1f01e8aa62b3573b", + "tests/output/exp_ctrl_matrix_streak_nx1500/streakline_C5_deceit_multi_f1p5_step040000.png": "dd5945458a35d81b31a0e2f3a693a5023d6960474263e7dc86c22367a56cc13c", + "tests/output/exp_ctrl_matrix_streak_nx1500/manifest.json": "0d97efed02f775c25dd8a2d7439f310b715d142ff8d603c9da6ddab197570ce8", + "tests/output/exp_ctrl_matrix_streak_nx1500/streakline_C3_deceit_multi.png": "69022ef9175acf910374ec73848640548b85fc7beb7e6950843f52c10ed7d61b", + "tests/output/exp_ctrl_matrix_streak_nx1500/streakline_C4_deceit_f1p5_step060000.png": "16ba30b8cca0d49e6b76be0bb4f0d14bbf276ca6ec47ebf56907c7534e15c4e0", + "tests/output/exp_ctrl_matrix_streak_nx1500/streakline_C5_deceit_multi_f1p5_step100000.png": "8548b6dff635cf9c92e2baa119866277e3994366eb31aeb30641b03b3d80ee9f", + "tests/output/exp_ctrl_matrix_streak_nx1500/streakline_C2_deceit_step060000.png": "56100f169c3e378b84bfc89c5477d2c142ca043d9f28eaa70bc5448c49c7f4d5", + "tests/output/exp_ctrl_matrix_streak_nx1500/summary_C2_deceit.json": "587cd42d81b1325bbc766d9ca6c1fd3d076bf5a772efd45d056c2c4e3db742b6", + "tests/output/exp_ctrl_matrix_streak_nx1500/streakline_C1_stealth_step060000.png": "e43e95e7126de8cb857154353f161914c225f8c9f17eb44b1ff744249368a4d5", + "tests/output/exp_ctrl_matrix_streak_nx1500/streakline_C6_deceit_f2_step080000.png": "676d21ffc7180d34a6725a8bf49503ce59f48d65500450c3975d01e65162899e", + "tests/output/exp_ctrl_matrix_streak_nx1500/summary_C1_stealth.json": "73040aeb7ef07c538d4687b101c599210e660202eb1c2c3e0894dfbde682d137", + "tests/output/exp_ctrl_matrix_streak_nx1500/streakline_C4_deceit_f1p5_step100000.png": "e22171ef86979c4398c45ada9cd0f5e4c4e5b034f271df5fa8ac9a762a8554cd", + "tests/output/exp_ctrl_matrix_streak_nx1500/streakline_C2_deceit_step100000.png": "0d73042be73b0de8d0a591e56c01e3c802483aa22a97f27e0300cba82c708066", + "tests/output/exp_ctrl_matrix_streak_nx1500/streakline_C4_deceit_f1p5_step040000.png": "a6e95fd5c24052db20d5ece200edcfe5e261c00950ca964c89df9f7335579634", + "tests/output/exp_ctrl_matrix_streak_nx1500/streakline_C0_no_ctrl.png": "d74061347ac3505fad878e330f6cb04d23bdb13082bfa1afa2fda0872f80f388", + "tests/output/exp_ctrl_matrix_streak_nx1500/streakline_C4_deceit_f1p5.png": "3156400eb59fae0638556c2711345f12ca49d951ff09e6464a2271249409a6a7", + "tests/output/exp_ctrl_matrix_streak_nx1500/streakline_C1_stealth_step100000.png": "d69e34c82da98b28eef7f1af29f5d11f400e90f628049f6f5f4a3a419a4a4340", + "tests/output/exp_ctrl_matrix_streak_nx1500/streakline_C6_deceit_f2_step040000.png": "ce1f372b517dd52fc3f3eb066145e04ab6841e43b67cb0f6bfbdb42a6738eca6", + "tests/output/exp_ctrl_matrix_streak_nx1500/streakline_C3_deceit_multi_step100000.png": "07cce6c99dfa7b56dd4d3aa452873a676a5a00e9f046555fa9dda30f16dde488", + "tests/output/exp_ctrl_matrix_streak_nx1500/streakline_C1_stealth.png": "a892f18c74fe13efd839bfd5068097ca0ae07acebf6c06eed89e1b867e41fcb2", + "tests/output/exp_ctrl_matrix_streak_nx1500/streakline_C6_deceit_f2_step060000.png": "80b63bd309ef11a3ebb2f1ef301b49cd8f09bcc25562097d382f859306c9fe6d", + "tests/output/exp_ctrl_matrix_streak_nx1500/streakline_C2_deceit.png": "1edb30dc35e29ad991695353f4b84e0507792935ec75ae9a7904ebdc007a471a", + "tests/output/exp_ctrl_matrix_streak_nx1500/streakline_C5_deceit_multi_f1p5_step060000.png": "93ab8e09e58a64c5dd2eedfdafd27cf4dcfe4e8fae1af64ac71eac509e6ffdaf", + "tests/output/exp_ctrl_matrix_streak_nx1500/streakline_C3_deceit_multi_step060000.png": "f773bdef1c8d718d01b6d6d7735182c04564dd8b5692b359e1dd2f721c774b1a", + "tests/output/exp_ctrl_matrix_streak_nx1500/streakline_C4_deceit_f1p5_step080000.png": "5570fe6a25c92e5c6aa9a5129aa1797ba8ee7418170c7a351f9e35b931a366c7", + "tests/output/exp_ctrl_matrix_streak_nx1500/streakline_C1_stealth_step080000.png": "32d3e700286eb4b46b3bcf757669481affd6ff6b53792d730b5a21da92cc57d6", + "tests/output/exp_ctrl_matrix_streak_nx1500/streakline_C6_deceit_f2_step100000.png": "5acfe36694bb4e628309ff8ae1e839ca0a1f684607165bbc2883436b85208bf4", + "tests/output/exp_ctrl_matrix_streak_nx1500/streakline_C2_deceit_step040000.png": "2c6f2b8d61cc2aaa63631eb6c98d3de26dcef705fa6b66c823ce7b9eef50e00c", + "tests/output/exp_ctrl_matrix_streak_nx1500/streakline_C5_deceit_multi_f1p5.png": "adbefd0021e2c981d026718de8c63594b9c8e5971901d1dc40835cb69d95b93e", + "tests/output/exp_ctrl_matrix_streak_nx1500/streakline_C2_deceit_step080000.png": "ce8b18e4dd976ed590fcc44075f3fb058ca7b23e15a1624726c181c4dd0c11da", + "tests/output/exp_ctrl_matrix_streak_nx1500/streakline_C3_deceit_multi_step040000.png": "168d21ef24ae198fbfd642f8ca315faad4c7bff2e2c09e16ff7c97e7360ea883", + "tests/output/screening/screening_summary.csv": "3a23c4f2bd54ed5ee9bdb5b6dcdc58eed04519fcf1b4790e0abd1e6c5288fb96", + "tests/output/screening/screening_summary.json": "caf64530f152b6b8ccec82a3c7ba44fa0b3aeb0e0221ef6121857bf62c031ecd", + "tests/output/screening/B1/force_hist.csv": "854bfebe63fb2d140823fc5dbc434a70c317c6ab0bedbd5220cec45665b524c8", + "tests/output/screening/B1/summary.json": "35b4d958bc0fdd6ab6c9c0d1ed50e85d89b04f7be3e34632d6c3ea95b89acb47", + "tests/output/screening/custom/force_hist.csv": "06da0f67b564d5c114332ef3b39167b1ba222fc50045f95303c75c14755b51d5", + "tests/output/screening/custom/summary.json": "1701ed75e5e9ca16127f495ccff1d87de245d81df581e94114c8fca6fbbe77fd", + "tests/output/screening/MR1/force_hist.csv": "f70fbfa748fd0709e225523aaaa72b761db56df4f1d48f105384b94cbc44b31f", + "tests/output/screening/MR1/summary.json": "3d9a0fc19710820e3634ab2143b913b282beb159336567ab9ebf3de2092947bd", + "tests/output/screening/MR2/force_hist.csv": "c947b3c16b8e8f8f85a203cea8cd912bdfc07f96985c1c24a470b644170195ea", + "tests/output/screening/MR2/summary.json": "d2344e9e2517ec76c8b56bfbe3763dd465e24721856992401c57c414763481bb", + "tests/output/screening/MR3/force_hist.csv": "7df1536c83ee466b7195d9c521d3d3b1309acaf142f2855bba51fb279c7612e4", + "tests/output/screening/MR3/summary.json": "ad188eb1b271a6cd0fb4025b456eccac5450776f60db58466f804fc5a0e0ec61", + "tests/postproc/run_exp_ctrl_matrix_vorticity.py": "b7e0c4113111b9b677f321750c0055656ccfa4f45c25fe7846f3ed22f30d1467", + "tests/postproc/vorticity_triangle_clean.png": "f831b8143b50f038d5920a0658469622655f34176d30cf7216feff108aa2ecaf", + "tests/postproc/run_kan99b_streakline.py": "a2bbf3fc629ea170d2d4879317dbf2b81c43378a328100ac1f2ee8d9895666cb", + "tests/postproc/streakline_triangle_clean.png": "aa6669de7af6f82e98af25698a15f494e9cea20cb911ad9a30fe52597d33bb79", + "tests/postproc/experiment.ipynb": "c6b45db1c57200f0777213ef8d44cb4996c1aa7a5fb42b968b77e56f51b4fca4", + "tests/postproc/run_stealth_steady_sweep.py": "3c32c4dede7da77fd6cfbd3f7b1ff43bb11390aaba621883ec96c6c7fdad5af7", + "tests/postproc/run_exp_ctrl_matrix_streakline.py": "529d5f31a3862080f890c65177502b589710b2d960ddf131abaf7dc2f9e2a96f", + "tests/screening/run_config_sweep.py": "5030c99923815ed6ad39110cb56f748c579ff4c66c7c1a368ad1a6008017e2ff", + "examples/fixed_periodic_patch.py": "6732e440a47c237ea341703f2d80717903d34c68fd061bdc97189e5d877be46c", + "examples/fixed_patch_jet.py": "9d58ac3f32478603e8e798efcdaf6ea16e9cc92346eb4780a60e438d331abced" + } +} diff --git a/research/fine_surface_20261014/cpu_device_guard_cmd.txt b/research/fine_surface_20261014/cpu_device_guard_cmd.txt new file mode 100644 index 0000000..06e0f35 --- /dev/null +++ b/research/fine_surface_20261014/cpu_device_guard_cmd.txt @@ -0,0 +1 @@ +PYTHONPATH=/home/frank14f/CelerisLab/src CUDA_VISIBLE_DEVICES='' /home/frank14f/anaconda3/envs/pycuda_3_10/bin/python -m pytest tests/validation/multigrid/test_fine_surface_gpu.py::test_missing_surface_device_buffer_rejects_before_launch -q diff --git a/research/fine_surface_20261014/cpu_device_guard_exit.txt b/research/fine_surface_20261014/cpu_device_guard_exit.txt new file mode 100644 index 0000000..573541a --- /dev/null +++ b/research/fine_surface_20261014/cpu_device_guard_exit.txt @@ -0,0 +1 @@ +0 diff --git a/research/fine_surface_20261014/cpu_device_guard_stdout.txt b/research/fine_surface_20261014/cpu_device_guard_stdout.txt new file mode 100644 index 0000000..424d584 --- /dev/null +++ b/research/fine_surface_20261014/cpu_device_guard_stdout.txt @@ -0,0 +1,2 @@ +.. [100%] +2 passed in 0.09s diff --git a/research/fine_surface_20261014/cpu_existing_runs.json b/research/fine_surface_20261014/cpu_existing_runs.json new file mode 100644 index 0000000..3179536 --- /dev/null +++ b/research/fine_surface_20261014/cpu_existing_runs.json @@ -0,0 +1,30 @@ +[ + { + "name": "cpu_maps", + "command": [ + "/home/frank14f/anaconda3/envs/pycuda_3_10/bin/python", + "-m", + "pytest", + "-q", + "-p", + "no:cacheprovider", + "tests/unit/test_refinement.py" + ], + "exit_code": 0, + "seconds": 1.8799934879643843 + }, + { + "name": "cpu_shared_kernel", + "command": [ + "/home/frank14f/anaconda3/envs/pycuda_3_10/bin/python", + "-m", + "pytest", + "-q", + "-p", + "no:cacheprovider", + "tests/unit/test_numerical_operators.py::test_actual_semantic_and_auxiliary_kernels[0-0-0]" + ], + "exit_code": 0, + "seconds": 2.1572919980389997 + } +] diff --git a/research/fine_surface_20261014/cpu_final_run.json b/research/fine_surface_20261014/cpu_final_run.json new file mode 100644 index 0000000..523fadb --- /dev/null +++ b/research/fine_surface_20261014/cpu_final_run.json @@ -0,0 +1,14 @@ +{ + "command": [ + "/home/frank14f/anaconda3/envs/pycuda_3_10/bin/python", + "-m", + "pytest", + "-q", + "-p", + "no:cacheprovider", + "tests/unit/test_fine_surface.py" + ], + "exit_code": 0, + "seconds": 1.947228622972034, + "note": "Final CPU recheck after preflight aperture inputs were aligned with packed FP32 lever arms. No kernel/math or uploaded-array changes." +} diff --git a/research/fine_surface_20261014/cpu_final_stdout.txt b/research/fine_surface_20261014/cpu_final_stdout.txt new file mode 100644 index 0000000..9cfe73d --- /dev/null +++ b/research/fine_surface_20261014/cpu_final_stdout.txt @@ -0,0 +1,2 @@ +............... [100%] +15 passed in 0.59s diff --git a/research/fine_surface_20261014/cpu_lifecycle_run.json b/research/fine_surface_20261014/cpu_lifecycle_run.json new file mode 100644 index 0000000..5b403b9 --- /dev/null +++ b/research/fine_surface_20261014/cpu_lifecycle_run.json @@ -0,0 +1,14 @@ +{ + "command": [ + "/home/frank14f/anaconda3/envs/pycuda_3_10/bin/python", + "-m", + "pytest", + "-q", + "-p", + "no:cacheprovider", + "tests/validation/multigrid/test_refinement_followup.py::FaultGuardsCPU", + "tests/validation/multigrid/test_refinement_gpu.py::CoupledGPU::test_cleanup_attempts_every_allocation" + ], + "exit_code": 0, + "seconds": 1.620646678027697 +} diff --git a/research/fine_surface_20261014/cpu_lifecycle_stdout.txt b/research/fine_surface_20261014/cpu_lifecycle_stdout.txt new file mode 100644 index 0000000..3c5c49b --- /dev/null +++ b/research/fine_surface_20261014/cpu_lifecycle_stdout.txt @@ -0,0 +1,2 @@ +..... [100%] +5 passed, 5 subtests passed in 0.25s diff --git a/research/fine_surface_20261014/cpu_maps_stdout.txt b/research/fine_surface_20261014/cpu_maps_stdout.txt new file mode 100644 index 0000000..71dd87f --- /dev/null +++ b/research/fine_surface_20261014/cpu_maps_stdout.txt @@ -0,0 +1,2 @@ +......... [100%] +9 passed, 23 subtests passed in 0.12s diff --git a/research/fine_surface_20261014/cpu_preallocation_run.json b/research/fine_surface_20261014/cpu_preallocation_run.json new file mode 100644 index 0000000..fa6e96d --- /dev/null +++ b/research/fine_surface_20261014/cpu_preallocation_run.json @@ -0,0 +1,14 @@ +{ + "command": [ + "/home/frank14f/anaconda3/envs/pycuda_3_10/bin/python", + "-m", + "pytest", + "-q", + "-p", + "no:cacheprovider", + "tests/validation/multigrid/test_fine_surface_gpu.py::test_cross_interface_donor_rejects_before_cuda" + ], + "exit_code": 0, + "seconds": 1.665132363094017, + "CUDA_VISIBLE_DEVICES": "" +} diff --git a/research/fine_surface_20261014/cpu_preallocation_stdout.txt b/research/fine_surface_20261014/cpu_preallocation_stdout.txt new file mode 100644 index 0000000..5d64357 --- /dev/null +++ b/research/fine_surface_20261014/cpu_preallocation_stdout.txt @@ -0,0 +1,2 @@ +. [100%] +1 passed in 0.09s diff --git a/research/fine_surface_20261014/cpu_shared_kernel_stdout.txt b/research/fine_surface_20261014/cpu_shared_kernel_stdout.txt new file mode 100644 index 0000000..8a0c046 --- /dev/null +++ b/research/fine_surface_20261014/cpu_shared_kernel_stdout.txt @@ -0,0 +1,2 @@ +. [100%] +1 passed in 0.63s diff --git a/research/fine_surface_20261014/cpu_surface_command.txt b/research/fine_surface_20261014/cpu_surface_command.txt new file mode 100644 index 0000000..2a5ff31 --- /dev/null +++ b/research/fine_surface_20261014/cpu_surface_command.txt @@ -0,0 +1 @@ +PYTHONPATH=src /home/frank14f/anaconda3/envs/pycuda_3_10/bin/python -m pytest tests/unit/test_fine_surface.py -q diff --git a/research/fine_surface_20261014/cpu_surface_exit.txt b/research/fine_surface_20261014/cpu_surface_exit.txt new file mode 100644 index 0000000..573541a --- /dev/null +++ b/research/fine_surface_20261014/cpu_surface_exit.txt @@ -0,0 +1 @@ +0 diff --git a/research/fine_surface_20261014/cpu_surface_projection_command.txt b/research/fine_surface_20261014/cpu_surface_projection_command.txt new file mode 100644 index 0000000..70b7f5c --- /dev/null +++ b/research/fine_surface_20261014/cpu_surface_projection_command.txt @@ -0,0 +1 @@ +PYTHONPATH=src /home/frank14f/anaconda3/envs/pycuda_3_10/bin/python -m pytest tests/unit/test_fine_surface.py -q -k 'projection_uses_cell_center or transfer_dependencies' diff --git a/research/fine_surface_20261014/cpu_surface_projection_exit.txt b/research/fine_surface_20261014/cpu_surface_projection_exit.txt new file mode 100644 index 0000000..573541a --- /dev/null +++ b/research/fine_surface_20261014/cpu_surface_projection_exit.txt @@ -0,0 +1 @@ +0 diff --git a/research/fine_surface_20261014/cpu_surface_projection_stdout.txt b/research/fine_surface_20261014/cpu_surface_projection_stdout.txt new file mode 100644 index 0000000..efd37a1 --- /dev/null +++ b/research/fine_surface_20261014/cpu_surface_projection_stdout.txt @@ -0,0 +1,2 @@ +... [100%] +3 passed, 12 deselected in 0.40s diff --git a/research/fine_surface_20261014/cpu_surface_stdout.txt b/research/fine_surface_20261014/cpu_surface_stdout.txt new file mode 100644 index 0000000..9cfe73d --- /dev/null +++ b/research/fine_surface_20261014/cpu_surface_stdout.txt @@ -0,0 +1,2 @@ +............... [100%] +15 passed in 0.59s diff --git a/research/fine_surface_20261014/gpu_preparation_run1.py b/research/fine_surface_20261014/gpu_preparation_run1.py new file mode 100644 index 0000000..ee586d0 --- /dev/null +++ b/research/fine_surface_20261014/gpu_preparation_run1.py @@ -0,0 +1,290 @@ +"""CPU preparation for one fixed D2Q9 2:1 patch and optional interior circles. + +Cell indices use y*nx+x; population slots use q*(nx*ny)+cell, matching +core/layout.cuh. Bounds are half-open (x0, y0, x1, y1) in coarse cells. +The four fine halo cells implement the pinned CPUREF volumetric geometry. +Base topology is independent of boundaries; prepare_fine_boundary checks them. +""" +from dataclasses import dataclass, replace +from numbers import Integral + +import numpy as np + +from ..config import LBMConfig +from .descriptors import D2Q9_EX, D2Q9_EY, FLUID, SOLID + +ACTIVE, INNER_GHOST, OUTER_GHOST = 0, 1, 2 +HALO = 4 + + +def _readonly(values, dtype): + array = np.ascontiguousarray(values, dtype=dtype) + array.setflags(write=False) + return array + + +@dataclass(frozen=True, eq=False) +class FixedPatch2D: + """Layer metadata and compact exchange tables, constructed by from_config. + + Shapes are (ny, nx), including the fine halo. ``fine_origin`` is its lower + cell edge in coarse physical units, with coarse dx=dt=1 and fine dx=dt=.5. + ``ghost_fine`` and ``ghost_coarse`` pair fine cells with coarse donors. + ``coalesce_coarse`` contains incoming population slots; each corresponding + row of ``coalesce_fine`` contains four fine slots in (dy, dx) row order. + Weights are all 1/4. Closed corner links are included even when the coarse + donor is uncovered. These tables contain no DDF data and allocate no GPU. + + This is preparation, not permission to advance these levels with OneStep: + its channel boundaries and fused collision do not implement patch coupling. + """ + coarse_shape: tuple[int, int] + bounds: tuple[int, int, int, int] + tau_coarse: float + tau_fine: float + fine_kind: np.ndarray + ghost_fine: np.ndarray + ghost_coarse: np.ndarray + coalesce_coarse: np.ndarray + coalesce_fine: np.ndarray + + @classmethod + def from_config(cls, cfg: LBMConfig, bounds) -> "FixedPatch2D": + """Prepare maps without changing cfg or allocating coarse-sized tables. + + The initial backend contract is D2Q9/SRT/FP32/unshifted/double_buffer, + without LES. Two coarse cells of margin keep all halo donors in bounds; + this does NOT certify that those donors are fluid or periodic. + """ + checked = replace(cfg) + checked.validate() + if (not checked.is_d2q9 or checked.collision != "SRT" + or checked.streaming != "double_buffer" + or checked.store_precision != "FP32" + or checked.ddf_shifting or checked.les_enabled): + raise ValueError("FixedPatch2D requires D2Q9/SRT/FP32/unshifted/double_buffer without LES") + bounds = tuple(bounds) + if len(bounds) != 4 or any(isinstance(v, (bool, np.bool_)) + or not isinstance(v, Integral) for v in bounds): + raise ValueError("bounds must be four integers: (x0, y0, x1, y1)") + x0, y0, x1, y1 = bounds = tuple(map(int, bounds)) + nx, ny = checked.nx, checked.ny + if not (2 <= x0 < x1 <= nx - 2 and 2 <= y0 < y1 <= ny - 2): + raise ValueError("patch must be nonempty with a two-coarse-cell margin") + fx, fy = 2 * (x1 - x0) + 2 * HALO, 2 * (y1 - y0) + 2 * HALO + if max(nx * ny, fx * fy) > np.iinfo(np.uint32).max: + raise ValueError("layer cell counts exceed uint32 indexing") + tau_c = 3.0 * checked.viscosity + 0.5 + tau_f = 6.0 * checked.viscosity + 0.5 + if not checked.omega_min <= 1.0 / tau_f <= checked.omega_max: + raise ValueError("fine relaxation rate lies outside configured omega guards") + + kind = np.full((fy, fx), OUTER_GHOST, dtype=np.uint8) + kind[2:-2, 2:-2] = INNER_GHOST + kind[HALO:-HALO, HALO:-HALO] = ACTIVE + gy, gx = np.nonzero(kind != ACTIVE) + ghost_fine = gy * fx + gx + ghost_coarse = (y0 + (gy - HALO) // 2) * nx + x0 + (gx - HALO) // 2 + + targets, sources = [], [] + # Only the outside ring can receive fine-to-coarse populations. + # Integer doubled midpoints include all eight diagonal corner passes. + for y in range(y0 - 1, y1 + 1): + xs = range(x0 - 1, x1 + 1) if y in (y0 - 1, y1) else (x0 - 1, x1) + for x in xs: + for q in range(1, 9): + mx, my = 2 * x + 1 - D2Q9_EX[q], 2 * y + 1 - D2Q9_EY[q] + if 2 * x0 <= mx <= 2 * x1 and 2 * y0 <= my <= 2 * y1: + targets.append(q * nx * ny + y * nx + x) + a, b = HALO + 2 * (x - x0), HALO + 2 * (y - y0) + sources.append([q * fx * fy + (b + dy) * fx + a + dx + for dy in (0, 1) for dx in (0, 1)]) + return cls((ny, nx), bounds, tau_c, tau_f, + _readonly(kind, np.uint8), + _readonly(ghost_fine, np.uint32), + _readonly(ghost_coarse, np.uint32), + _readonly(targets, np.uint64), + _readonly(sources, np.uint64).reshape(-1, 4)) + + @property + def fine_shape(self) -> tuple[int, int]: + return self.fine_kind.shape + + @property + def fine_origin(self) -> tuple[float, float]: + return self.bounds[0] - HALO / 2, self.bounds[1] - HALO / 2 + + @property + def table_bytes(self) -> int: + return sum(a.nbytes for a in (self.fine_kind, self.ghost_fine, + self.ghost_coarse, self.coalesce_coarse, + self.coalesce_fine)) + + def check_synchronization(self, coarse_steps: int, fine_steps: int, *, phase: str) -> None: + """Check a proposed backend handoff; does not convert or collide data. + + Production storage is g=C(f), while CPUREF returns arrival_f. A future + g-to-g coarse step must collide coarse cells once and fine cells twice; + fine halo ghosts never collide. Coalescence must precede coarse collision. + Converting reference f to g for comparison is an observation operation, + not an additional production collision. Counts here are completed steps. + """ + if phase != "postcollision_g": + raise ValueError("patch backend handoff requires postcollision_g") + for value in (coarse_steps, fine_steps): + if isinstance(value, (bool, np.bool_)) or not isinstance(value, Integral) or value < 0: + raise ValueError("step counts must be nonnegative integers") + if fine_steps != 2 * coarse_steps: + raise ValueError("levels are not synchronized: fine_steps must equal 2*coarse_steps") + + +@dataclass(frozen=True, eq=False) +class FineBoundary2D: + """Fixed local projection plus auditable, finite transfer dependency sets. + + transfer_reads rows are (hop, direction, cell), traced from coalescence at + hop 2 back to exploded G at hop 0. No previous coarse interval is traversed. + Cell footprints also include the whole explosion write/donor tables. + """ + objects: tuple + flags: np.ndarray + curved_host: tuple + boundary_cells: np.ndarray + transfer_fine_cells: np.ndarray + transfer_coarse_cells: np.ndarray + transfer_reads: np.ndarray + + +def _transfer_footprint(patch): + ny, nx = patch.fine_shape + cells = nx * ny + pending = [(2, *divmod(int(slot), cells)) for slot in patch.coalesce_fine.ravel()] + reads = set() + while pending: + hop, q, k = pending.pop() + if (hop, q, k) in reads: + continue + reads.add((hop, q, k)) + if hop == 0: + continue + y, x = divmod(k, nx) + kind = patch.fine_kind[y, x] + if kind == OUTER_GHOST: + raise ValueError("Transfer reads an invalid post-hop outer ghost") + # A collided output depends on all nine arrivals; ghosts only stream. + for direction in (range(9) if kind == ACTIVE else (q,)): + sx, sy = x - D2Q9_EX[direction], y - D2Q9_EY[direction] + if not (0 <= sx < nx and 0 <= sy < ny): + raise ValueError("Transfer dependency leaves the fine allocation") + pending.append((hop - 1, direction, sy * nx + sx)) + fine = set(map(int, patch.ghost_fine)) | {k for _, _, k in reads} + coarse = set(map(int, patch.ghost_coarse)) | set(map( + int, patch.coalesce_coarse % np.prod(patch.coarse_shape))) + return fine, coarse, _readonly(sorted(reads), np.int64) + + +def prepare_fine_boundary(cfg, patch, objects, *, wall_aware=False): + """Project fixed circles and reject boundary/transfer overlap before CUDA. + + Input centers/radii are in coarse physical coordinates (dx=dt=1). + SurfaceActuation retains its lattice-velocity meaning: input coarse units + are converted into independent fine-local objects with dx=dt=.5. + Original objects are not retained or mutated. No runtime geometry updates. + """ + if not objects: + return None + checked = replace(cfg) + checked.validate() + if (patch.coarse_shape != (cfg.ny, cfg.nx) or not checked.is_d2q9 + or checked.collision != "SRT" or checked.streaming != "double_buffer" + or checked.store_precision != "FP32" or checked.ddf_shifting or checked.les_enabled + or patch.tau_coarse != 3*checked.viscosity+.5): + raise ValueError("Fine boundary requires the matching fixed-patch configuration") + from ..body.geometry.circle import CircleGeometry + from ..body.objects import SimObject + from ..body.coupling.soa_packer import pack_cut_links_to_soa + + ny, nx = patch.fine_shape + fine_cfg = replace(cfg, nx=nx, ny=ny, viscosity=2 * cfg.viscosity) + flags = np.full(nx * ny, FLUID, np.uint16) + active = patch.fine_kind.ravel() == ACTIVE + local, links = [], [] + x0, y0, x1, y1 = patch.bounds + dx = dt = .5 + for bid, obj in enumerate(objects): + if (type(obj.geometry) is not CircleGeometry or obj.is_sensor or obj.is_force_region + or any(getattr(obj.state, name) != 0 for name in ("vx", "vy", "omega")) + or any(vars(obj.control).values())): + raise ValueError("Fine boundaries require stationary circles without other roles") + cx, cy = obj.geometry.center + radius = obj.geometry._radius + if (not np.isfinite([cx, cy, radius]).all() or radius <= 0 + or cx-radius < x0 or cx+radius > x1 or cy-radius < y0 or cy+radius > y1): + raise ValueError("Entire fine circle must lie inside the physical patch") + center = tuple((v-o)/dx-.5 for v, o in zip((cx, cy), patch.fine_origin)) + spec = obj.surface_actuation + if spec is not None: + spec = replace(spec, normal_velocity=spec.normal_velocity * dt / dx) + item = SimObject(bid, geometry=CircleGeometry(*center, radius/dx), + center=center, radius=radius/dx, surface_actuation=spec) + item.validate_surface_actuation(fine_cfg) + mask = item.get_flag_mask(nx, ny) + solid = (mask & SOLID) != 0 + if not solid.any() or np.any(solid & ~active) or np.any(flags[solid] & SOLID): + raise ValueError("Fine solids must be resolved, disjoint and entirely active") + flags[solid] = mask[solid] + local.append(item) + for item in local: + cut = item.geometry.build_cut_links(nx, ny, domain_flags=flags) + if not cut: + raise ValueError("Fine circle has no resolved cut links") + if item.surface_actuation is not None: + _, aperture = item.surface_actuation.project( + np.array([link.rx for link in cut]), np.array([link.ry for link in cut])) + if not aperture.any(): + raise ValueError("Surface aperture hits no resolved cut links") + for link in cut: + link.body_id = item.obj_id + links.extend(cut) + + boundary, writers, receivers = set(), set(), set() + for link in links: + r, q = link.fluid_idx, link.dir + y, x = divmod(r, nx) + sx, sy = x + D2Q9_EX[q], y + D2Q9_EY[q] + s = sy * nx + sx + if not (active[r] and flags[r] & FLUID and active[s] and flags[s] & SOLID): + raise ValueError("Cut-link receiver/source must be active fluid/solid") + writer = (s, q+1 if q % 2 else q-1) + if writer in writers: + raise ValueError("Duplicate fine boundary writer") + writers.add(writer) + receivers.add((r, q)) + boundary.update((r, s)) + if link.q < .5: + dx_, dy_ = x - D2Q9_EX[q], y - D2Q9_EY[q] + if not (0 <= dx_ < nx and 0 <= dy_ < ny and active[dy_*nx+dx_]): + raise ValueError("q<.5 donor crosses the fine active interface; fallback cannot hide it") + boundary.add(dy_*nx+dx_) + # Reverse coverage: every fluid pull across a solid neighbor needs a writer. + required = set() + for r in np.flatnonzero(active & ((flags & FLUID) != 0)): + for q in range(1, 9): + if flags[r + D2Q9_EX[q] + nx*D2Q9_EY[q]] & SOLID: + required.add((int(r), q)) + if required != receivers: + raise ValueError("Fine solid pull coverage does not match the cut links") + fine, coarse, reads = _transfer_footprint(patch) + if fine & (boundary | set(map(int, np.flatnonzero(flags & SOLID)))): + raise ValueError("Boundary stencil overlaps the two-hop transfer footprint") + for k in coarse: + y, x = divmod(k, cfg.nx) + if x0 <= x < x1 and y0 <= y < y1: + raise ValueError("Transfer coarse donor/target is not an uncovered bulk cell") + if wall_aware and (y <= 2 or y >= cfg.ny-3): + raise ValueError("Transfer footprint touches the coarse wall reconstruction stencil") + return FineBoundary2D(tuple(local), _readonly(flags, np.uint16), + tuple(_readonly(a, a.dtype) for a in pack_cut_links_to_soa(links)), + _readonly(sorted(boundary), np.uint32), + _readonly(sorted(fine), np.uint32), + _readonly(sorted(coarse), np.uint32), reads) diff --git a/research/fine_surface_20261014/gpu_run.json b/research/fine_surface_20261014/gpu_run.json new file mode 100644 index 0000000..15b8ba7 --- /dev/null +++ b/research/fine_surface_20261014/gpu_run.json @@ -0,0 +1,48 @@ +{ + "start_utc": "2026-10-14T05:08:55.958692+00:00", + "preflight_gpu": "0, GPU-e8853ae7-a302-6a17-bcfa-aa767e9ed20c, Tesla V100-SXM2-16GB, 5, 16140, 0\n1, GPU-f1c9fd5a-e917-56e0-21fb-24035ba44a36, Tesla V100-SXM2-16GB, 5, 16140, 0\n2, GPU-b8c11c01-c91f-aa0b-abf6-dad35085cc76, Tesla V100-SXM2-16GB, 5, 16140, 0\n3, GPU-8b71b032-1b75-2891-935c-ce106a53034a, Tesla V100-SXM2-16GB, 5, 16140, 0", + "preflight_apps": "", + "preflight_ram_bytes": 64091750400, + "physical_gpu_uuid": "GPU-e8853ae7-a302-6a17-bcfa-aa767e9ed20c", + "command": [ + "/home/frank14f/anaconda3/envs/pycuda_3_10/bin/python", + "-c", + "import CelerisLab,pytest; print('SOURCE', CelerisLab.__file__, flush=True); assert CelerisLab.__file__.startswith('/home/frank14f/CelerisLab/src/'); raise SystemExit(pytest.main(['-q', '-s', '-p', 'no:cacheprovider', 'tests/validation/multigrid/test_fine_surface_gpu.py', 'tests/validation/multigrid/test_refinement_followup.py::NormalBuildGPU::test_offcenter_rectangle_margin_two_one_step', 'tests/validation/multigrid/test_refinement_followup.py::NormalBuildGPU::test_slot_reservoir_eight_steps']))" + ], + "cwd": "/home/frank14f/CelerisLab", + "env": { + "PYTHONPATH": "/home/frank14f/CelerisLab/src", + "PYTHONNOUSERSITE": "1", + "PYTHONDONTWRITEBYTECODE": "1", + "OPENBLAS_NUM_THREADS": "1", + "CUDA_VISIBLE_DEVICES": "GPU-e8853ae7-a302-6a17-bcfa-aa767e9ed20c", + "CUDA_CACHE_DISABLE": "1", + "TMPDIR": "/tmp/celeris-fine-surface-gpu-e9g3hz7z" + }, + "preflight_temp_bytes": 1637890, + "limits": { + "wall_seconds": 120, + "temp_bytes": 2000000000, + "ram_reserve_bytes": 6409175040, + "vram_reserve_MiB": 1614 + }, + "note": "Sampled own process group; no fixed RSS/address-space cap.", + "exit_code": 1, + "elapsed_seconds": 25.39498820400331, + "peak_group_rss_bytes": 386883584, + "peak_temp_bytes": 3585985, + "min_ram_bytes": 63638339584, + "min_vram_free_MiB": 15826, + "termination_reason": null, + "scratch_removed": true, + "source_hashes_captured_during_run": { + "src/CelerisLab/lbm/kernels/refinement.cu": "129f3d91da93b4324f88a0da73a4da1e5390f72c14cce574ee63306712da9895", + "src/CelerisLab/lbm/kernels/step/aux_kernels.cu": "578a5b20a157241ee678547059abb1372dd5a589ad06bb2c15b987eb01ca1013", + "src/CelerisLab/lbm/kernels/step/curved_double.cu": "bfa7a1df1e939020314d49755045f7a85fe4a19cc1c68dbe62653c66c5e7c2b3", + "src/CelerisLab/lbm/refinement.py": "b3fe9e58118369adb1bdfc618fbfbd917d508a563beaf2555f656b59aeff4425", + "src/CelerisLab/lbm/refinement_stepper.py": "9178224089ee6584420b79f10cf1d91441645b668e8b6898641d19eac757687b", + "src/CelerisLab/lbm/stepper.py": "0dcb7cd7ae87e33e3dc67a38b6aa43042fbe673e37d9ad165342ee1d695933ce", + "tests/unit/test_fine_surface.py": "b232b55e75eef52480f06a35c401d72b6145892bb8b79d1d1b3cfed965b3506c", + "tests/validation/multigrid/test_fine_surface_gpu.py": "3dd0658f63a4e7a1c41eecf433842c872f8fecb391ea4b44d0b48947643d5189" + } +} diff --git a/research/fine_surface_20261014/gpu_stdout.txt b/research/fine_surface_20261014/gpu_stdout.txt new file mode 100644 index 0000000..c5216e0 --- /dev/null +++ b/research/fine_surface_20261014/gpu_stdout.txt @@ -0,0 +1,79 @@ +SOURCE /home/frank14f/CelerisLab/src/CelerisLab/__init__.py +speed=0.0 audit=True BFL=7.4505806e-09 ledger=[1.604948192834854e-05, -5.038455128669739e-07, -6.919726729393005e-07] budget=0.00221051117 boundary=[4.0978193283081055e-08, 0.0, 0.0] transfer=[0.0, 0.0, 0.0] drive_mass=+4.09781933e-08; counts=PASS +speed=None audit=False BFL=7.4505806e-09 ledger=[1.604948192834854e-05, -5.038455128669739e-07, -6.919726729393005e-07] budget=0.00221051117 boundary=[4.0978193283081055e-08, 0.0, 0.0] transfer=[0.0, 0.0, 0.0] drive_mass=+4.09781933e-08; counts=normal build +.speed=0.002 audit=True BFL=9.73073444e-09 ledger=[1.597730442881584e-05, -5.154870450496674e-07, -7.622875273227692e-07] budget=0.00221052543 boundary=[0.0071802823804318905, 0.003110995050519705, 0.0026390845887362957] transfer=[0.0, 0.0, 0.0] drive_mass=+0.00620033871; counts=PASS +.speed=-0.002 audit=True BFL=7.4505806e-09 ledger=[1.66366808116436e-05, -5.881302058696747e-07, -7.147900760173798e-07] budget=0.00221049693 boundary=[-0.007164992857724428, -0.0030983122996985912, -0.00262861093506217] transfer=[0.0, 0.0, 0.0] drive_mass=-0.00618575338; counts=PASS +.FF.normal rectangle 17x13 bounds=(2, 2, 6, 5) fine=16x14 steps=1: max_population=1.14050047e-07 device_arrays=35288; halo/stride PASS +host_peak_rss=279.887 MiB +.slot/reservoir steps=8 max_population=1.78241457e-07 max_BC_error=2.21654773e-07 discrete_leaf_mass_change=+0.0309633738 final_sum_rho_v_bottom=0.00426894613 top=0.000960694626; raw halos/corners/fine BC isolation PASS +host_peak_rss=279.887 MiB +. +=================================== FAILURES =================================== +_ test_missing_surface_device_buffer_rejects_before_launch[surface_velocity_gpu] _ + +missing = 'surface_velocity_gpu' + + @pytest.mark.parametrize("missing", ["surface_velocity_gpu", "link_exchange_gpu"]) + def test_missing_surface_device_buffer_rejects_before_launch(missing): + backend = implementation.FixedPatchStepper.__new__(implementation.FixedPatchStepper) + backend.fine_boundary = SimpleNamespace(objects=[object_spec(.002)]) + backend._fine_curved = SimpleNamespace(surface_velocity_gpu=object(), link_exchange_gpu=object()) + setattr(backend._fine_curved, missing, None) + backend._curved = Mock() + with pytest.raises(RuntimeError, match="Surface boundary device buffers are missing"): +> backend._apply_fine_boundary(object()) + +tests/validation/multigrid/test_fine_surface_gpu.py:289: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +self = +buffer = , kw = {} +cl = namespace(surface_velocity_gpu=None, link_exchange_gpu=) + + def _apply_fine_boundary(self, buffer, **kw): + """Stage solid source slots; exchange buffer holds this fine substep only.""" + cl = self._fine_curved + if cl is None: + if self.fine_boundary is not None: + raise RuntimeError("Fine boundary device buffers are missing") + return +> if self._curved is None or cl.fluid_idx_gpu is None: +E AttributeError: 'types.SimpleNamespace' object has no attribute 'fluid_idx_gpu' + +src/CelerisLab/lbm/refinement_stepper.py:195: AttributeError +_ test_missing_surface_device_buffer_rejects_before_launch[link_exchange_gpu] __ + +missing = 'link_exchange_gpu' + + @pytest.mark.parametrize("missing", ["surface_velocity_gpu", "link_exchange_gpu"]) + def test_missing_surface_device_buffer_rejects_before_launch(missing): + backend = implementation.FixedPatchStepper.__new__(implementation.FixedPatchStepper) + backend.fine_boundary = SimpleNamespace(objects=[object_spec(.002)]) + backend._fine_curved = SimpleNamespace(surface_velocity_gpu=object(), link_exchange_gpu=object()) + setattr(backend._fine_curved, missing, None) + backend._curved = Mock() + with pytest.raises(RuntimeError, match="Surface boundary device buffers are missing"): +> backend._apply_fine_boundary(object()) + +tests/validation/multigrid/test_fine_surface_gpu.py:289: +_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + +self = +buffer = , kw = {} +cl = namespace(surface_velocity_gpu=, link_exchange_gpu=None) + + def _apply_fine_boundary(self, buffer, **kw): + """Stage solid source slots; exchange buffer holds this fine substep only.""" + cl = self._fine_curved + if cl is None: + if self.fine_boundary is not None: + raise RuntimeError("Fine boundary device buffers are missing") + return +> if self._curved is None or cl.fluid_idx_gpu is None: +E AttributeError: 'types.SimpleNamespace' object has no attribute 'fluid_idx_gpu' + +src/CelerisLab/lbm/refinement_stepper.py:195: AttributeError +=========================== short test summary info ============================ +FAILED tests/validation/multigrid/test_fine_surface_gpu.py::test_missing_surface_device_buffer_rejects_before_launch[surface_velocity_gpu] +FAILED tests/validation/multigrid/test_fine_surface_gpu.py::test_missing_surface_device_buffer_rejects_before_launch[link_exchange_gpu] +2 failed, 6 passed in 23.73s diff --git a/research/fine_surface_20261014/gpu_test_run1.py b/research/fine_surface_20261014/gpu_test_run1.py new file mode 100644 index 0000000..f30376a --- /dev/null +++ b/research/fine_surface_20261014/gpu_test_run1.py @@ -0,0 +1,316 @@ +"""Two coarse/four fine steps: isolated fine circle, no flux-accuracy claim. + +Run only through the bounded GPU runner after a fresh resource check. The test +hooks read actual kernel inputs/outputs; they never change the stepping order. +""" +import importlib.util +from contextlib import nullcontext +from pathlib import Path +from threading import RLock +from types import SimpleNamespace +from unittest.mock import Mock, patch + +import numpy as np +import pycuda.driver as cuda +import pytest + +import CelerisLab +from CelerisLab.body.geometry.circle import CircleGeometry +from CelerisLab.body.objects import SimObject +from CelerisLab.config import LBMConfig +from CelerisLab.cuda import compiler_v2 as compiler +from CelerisLab.cuda.context import CudaContext +from CelerisLab.lbm import refinement_stepper as implementation +from CelerisLab.lbm.descriptors import FLUID, SOLID + + +ROOT = Path(__file__).resolve().parents[3] +CX = np.array([0, 1, -1, 0, 0, 1, -1, 1, -1]) +CY = np.array([0, 0, 0, 1, -1, 1, -1, -1, 1]) +OPP = np.array([0, 2, 1, 4, 3, 6, 5, 8, 7]) +W = np.array([4/9]+[1/9]*4+[1/36]*4) +MOMENTS = np.stack((np.ones(9), CX, CY)) +GEOMETRY = ("fluid_idx", "dir", "q", "body_id", "rx", "ry", "rz", "fallback_class") +BOUNDS = (4, 4, 20, 20) + + +def read(pointer, shape, dtype=np.float32): + values = np.empty(shape, dtype) + cuda.memcpy_dtoh(values, pointer) + return values + + +def rest(shape): + return np.broadcast_to(W[:, None, None], (9, *shape)).astype(np.float32).copy() + + +def surface(speed): + return None if speed is None else dict(angle=.7, half_width=.85, normal_velocity=speed) + + +def object_spec(speed): + return SimObject(0, CircleGeometry(12.25, 12.25, 2.15), center=(12.25, 12.25), + radius=2.15, surface_actuation=surface(speed)) + + +def audit_compiler(original): + def compile_private(*args, **kwargs): + entry = Path(kwargs["build_dir"])/"fine_surface_audit.cu" + entry.write_text('#define CELERIS_REFINEMENT_AUDIT\n#include "refinement.cu"\n') + kwargs["source"] = entry.name + return original(*args, **kwargs) + return compile_private + + +def reflection_oracle(before, cl, speed, *, verify_projection=True): + """FP64 BFL from frozen spatial populations, independent arc projection.""" + flat = before.astype(float).reshape(9, -1) + radius = np.hypot(cl.rx.astype(float), cl.ry.astype(float)) + delta = (np.arctan2(cl.ry.astype(float), cl.rx.astype(float))-.7+np.pi) % (2*np.pi)-np.pi + amplitude = 0 if speed is None else speed + strength = amplitude*np.maximum(0, 1-(delta/.85)**2)**2 + velocity = strength[:, None]*np.column_stack((cl.rx, cl.ry))/radius[:, None] + if verify_projection and cl.surface_velocity is not None: + np.testing.assert_allclose(cl.surface_velocity, velocity, atol=3e-9, rtol=0) + incoming = [] + for i, (k, d, q, fallback) in enumerate(zip(cl.fluid_idx, cl.dir, cl.q, cl.fallback_class)): + k, d, q = int(k), int(d), float(q) + rho = flat[:, k].sum() + dot = CX[d]*velocity[i, 0]+CY[d]*velocity[i, 1] + if fallback: + value = flat[d, k]-6*W[d]*rho*dot + elif q < .5: + value = 2*q*flat[d, k]+(1-2*q)*flat[d, k-CX[d]-40*CY[d]]-6*W[d]*rho*dot + else: + value = flat[d, k]/(2*q)+(1-1/(2*q))*flat[OPP[d], k]-3*W[d]*rho*dot/q + incoming.append(value) + return np.array(incoming) + + +def fine_flux(before, staged, active, solid): + """Population ledger across the fine leaf boundary: solid versus halo. + + Internal fluid-to-fluid streaming cancels pairwise; solid and halo packets + are counted in their actual direction, before any collision. + """ + boundary, transfer = np.zeros(9), np.zeros(9) + magnitude = 0.0 + for d, (cx, cy) in enumerate(zip(CX, CY)): + incoming = active & ~np.roll(active, (cy, cx), (0, 1)) + outgoing = active & ~np.roll(active, (-cy, -cx), (0, 1)) + from_solid = np.roll(solid, (cy, cx), (0, 1)) + into_solid = np.roll(solid, (-cy, -cx), (0, 1)) + received = np.roll(staged[d], (cy, cx), (0, 1)).astype(float) + sent = before[d].astype(float) + for vector, inc, out in ((boundary, incoming & from_solid, outgoing & into_solid), + (transfer, incoming & ~from_solid, outgoing & ~into_solid)): + assert np.isfinite(received[inc]).all() and np.isfinite(sent[out]).all() + vector[d] = received[inc].sum()-sent[out].sum() + magnitude += np.abs(received[inc]).sum()+np.abs(sent[out]).sum() + return boundary, transfer, magnitude + + +def coarse_flux(before, fine, active): + """Derive every replacement from physical midpoints, not production tables.""" + x0, y0, x1, y1 = BOUNDS + incoming = np.stack([np.roll(before[d], (CY[d], CX[d]), (0, 1)) for d in range(9)]).astype(float) + magnitude = 0.0 + for y, x in np.argwhere(active): + for d in range(1, 9): + if x0 <= x+.5-CX[d]/2 <= x1 and y0 <= y+.5-CY[d]/2 <= y1: + a, b = 4+2*(x-x0), 4+2*(y-y0) + children = fine[d, b:b+2, a:a+2].astype(float) + assert children.shape == (2, 2) and np.isfinite(children).all() + incoming[d, y, x] = children.sum()/4 + magnitude += np.abs(children).sum()/4 + assert np.isfinite(incoming[:, active]).all() + # This retains the eight grazing-corner replacements of uncovered donors. + flux = (incoming[:, active]-before[:, active].astype(float)).sum(axis=1) + magnitude += np.abs(incoming[:, active]).sum()+np.abs(before[:, active]).sum(dtype=float) + return flux, magnitude + + +def run_patch(speed, *, audit=True): + cfg = LBMConfig(nx=24, ny=24, viscosity=.05, velocity=0, rho=1) + coarse_active = np.ones((24, 24), bool) + coarse_active[4:20, 4:20] = False + source = object_spec(speed) + state = vars(source.state).copy() + with CudaContext(0) as context: + build = (patch.object(compiler, "compile_kernel", audit_compiler(compiler.compile_kernel)) + if audit else nullcontext()) + with build: + backend = implementation.FixedPatchStepper(cfg, BOUNDS, context=context, fine_objects=[source]) + with backend, context.activate(): + c, f = backend._levels + cl = backend._fine_curved + geometry = {name: getattr(cl, name).copy() for name in GEOMETRY} + flags = backend.fine_boundary.flags.reshape(40, 40) + solid = (flags & SOLID) != 0 + active = np.zeros((40, 40), bool) + active[4:-4, 4:-4] = True + active &= (flags & FLUID) != 0 + active &= ~solid + local = backend.fine_boundary.objects[0] + assert local.center == (20., 20.) and local.radius == 4.3 + assert source.center == (12.25, 12.25) and source.radius == 2.15 + yy, xx = np.mgrid[:40, :40] + roi = active & ((xx-20)**2+(yy-20)**2 <= 9**2) + backend.initialize(rest((24, 24)), rest((40, 40))) + if audit: + for level in backend._levels: + for name in ("collision_counts", "explosion_counts", "incoming_counts"): + pointer, size = level.module.get_global(name) + cuda.memset_d8(pointer, 0, size) + initial = backend.download() + initial_pop = initial[0][:, coarse_active].sum(axis=1, dtype=float) + initial_pop += .25*initial[1][:, active].sum(axis=1, dtype=float) + boundary, fine_transfer, coarse_transfer = np.zeros(9), np.zeros(9), np.zeros(9) + budget_sum, reflection_error, drive_mass = 0., 0., 0. + traces = [] + original_curved, original_fine, original_coarse = backend._curved, f.kernel, c.kernel + + def curved(*args, **kwargs): + nonlocal boundary, fine_transfer, budget_sum, reflection_error, drive_mass + backend._stream.synchronize() + before = read(args[0], f.shape) + expected = reflection_oracle(before, cl, speed) + original_curved(*args, **kwargs) + backend._stream.synchronize() + staged = read(args[0], f.shape) + d, k = cl.dir.astype(int), cl.fluid_idx.astype(int) + values = staged.reshape(9, -1)[OPP[d], k+CX[d]+40*CY[d]] + passive = reflection_oracle(before, cl, None, verify_projection=False) + drive_mass += .25*float(np.sum(values-passive)) + error = float(np.max(np.abs(values-expected))) + reflection_error = max(reflection_error, error) + assert error <= 1e-7 + np.testing.assert_array_equal(staged[:, active], before[:, active]) + b, transfer, magnitude = fine_flux(before, staged, active, solid) + boundary += .25*b + fine_transfer += .25*transfer + budget_sum += .25*magnitude + + def fine(*args, **kwargs): + nonlocal budget_sum + backend._stream.synchronize() + staged = read(args[0], f.shape) + original_fine(*args, **kwargs) + backend._stream.synchronize() + advanced = read(args[1], f.shape) + assert np.isfinite(advanced[:, active]).all() + assert np.isnan(advanced[:, solid]).all() + # Include actual collision operands in the FP32 rounding budget. + budget_sum += .25*np.abs(staged[:, active]).sum(dtype=float) + traces.append(advanced[:, roi].copy()) + + def coarse(*args, **kwargs): + nonlocal coarse_transfer, budget_sum + backend._stream.synchronize() + before, fine_values = read(args[0], c.shape), read(args[2], f.shape) + transfer, magnitude = coarse_flux(before, fine_values, coarse_active) + coarse_transfer += transfer + budget_sum += magnitude + return original_coarse(*args, **kwargs) + + with patch.object(backend, "_curved", curved), patch.object(f, "kernel", fine), \ + patch.object(c, "kernel", coarse): + backend.step(2) + actual = backend.download() + population = actual[0][:, coarse_active].sum(axis=1, dtype=float) + population += .25*actual[1][:, active].sum(axis=1, dtype=float) + ledger = boundary+fine_transfer+coarse_transfer + error = MOMENTS@(population-initial_pop-ledger) + budget = 8*np.finfo(np.float32).eps*budget_sum + assert np.isfinite(budget_sum) and budget_sum > 0 + assert np.max(np.abs(error)) <= budget + if speed: + assert speed*drive_mass > 0 + assert len(traces) == 4 and backend.step_count == 2 + if audit: + for level, mask, count in ((c, coarse_active, 2), (f, active, 4)): + pointer, size = level.module.get_global("collision_counts") + counts = read(pointer, mask.shape, np.uint32) + assert size == counts.nbytes + np.testing.assert_array_equal(counts, count*mask) + for name, values in geometry.items(): + np.testing.assert_array_equal(getattr(cl, name), values) + assert vars(source.state) == state and source.geometry.center == source.center + print(f"speed={speed} audit={audit} BFL={reflection_error:.9g} ledger={error.tolist()} " + f"budget={budget:.9g} boundary={list(MOMENTS@boundary)} " + f"transfer={list(MOMENTS@(fine_transfer+coarse_transfer))} " + f"drive_mass={drive_mass:+.9g}; counts={'PASS' if audit else 'normal build'}", flush=True) + return traces, roi, actual + + +def uniform_reference(speed, roi): + # Reuse the existing explicit config helper without importing unrelated tests. + spec = importlib.util.spec_from_file_location("fine_surface_cases", ROOT/"tests/integration/_cases.py") + cases = importlib.util.module_from_spec(spec) + spec.loader.exec_module(cases) + with cases.make_sim(nx=48, ny=48, viscosity=.1, velocity=0, rho=1) as sim: + sim.add_body("circle", center=(24, 24), radius=4.3, surface_actuation=surface(speed)) + sim.initialize() + # Uniform 48^2 has the same dx=dt=.5 representation. Its distant channel + # boundaries cannot influence the circle ROI within these four hops. + traces = [] + for _ in range(4): + sim.run(1) + traces.append(sim.get_ddf().reshape(9, 48, 48)[:, 4:44, 4:44][:, roi].copy()) + return traces + + +@pytest.mark.parametrize("speed", [0., .002, -.002]) +def test_fine_surface_four_hops(speed): + assert Path(CelerisLab.__file__).resolve() == ROOT/"src/CelerisLab/__init__.py" + assert Path(compiler._KERNEL_DIR).resolve() == ROOT/"src/CelerisLab/lbm/kernels" + assert Path(implementation.__file__).resolve() == ROOT/"src/CelerisLab/lbm/refinement_stepper.py" + actual, roi, final = run_patch(speed) + reference = uniform_reference(speed, roi) + for got, wanted in zip(actual, reference): + np.testing.assert_allclose(got, wanted, atol=3e-6, rtol=0) + np.testing.assert_allclose(MOMENTS@got.astype(float), MOMENTS@wanted.astype(float), + atol=2e-5, rtol=0) + if speed == 0: + passive, passive_roi, passive_final = run_patch(None, audit=False) + np.testing.assert_array_equal(passive_roi, roi) + for got, wanted in zip(actual+list(final), passive+list(passive_final)): + np.testing.assert_array_equal(got, wanted) + + +@pytest.mark.parametrize("missing", ["surface_velocity_gpu", "link_exchange_gpu"]) +def test_missing_surface_device_buffer_rejects_before_launch(missing): + backend = implementation.FixedPatchStepper.__new__(implementation.FixedPatchStepper) + backend.fine_boundary = SimpleNamespace(objects=[object_spec(.002)]) + backend._fine_curved = SimpleNamespace(surface_velocity_gpu=object(), link_exchange_gpu=object()) + setattr(backend._fine_curved, missing, None) + backend._curved = Mock() + with pytest.raises(RuntimeError, match="Surface boundary device buffers are missing"): + backend._apply_fine_boundary(object()) + backend._curved.assert_not_called() + + +def test_close_frees_fine_boundary_after_stream_failure_once(): + backend = implementation.FixedPatchStepper.__new__(implementation.FixedPatchStepper) + backend.ctx = SimpleNamespace(activate=nullcontext) + backend._lock = RLock() + backend._status = "ready" + stream, soa, first, second = Mock(), Mock(), Mock(), Mock() + stream.synchronize.side_effect = RuntimeError("stream synchronization failed") + backend._stream = stream + backend._fine_curved = soa + backend._fine_flags = first + backend._curved = Mock() + backend._levels = [object(), object()] + backend._allocations = [first, second] + with pytest.raises(RuntimeError, match="stream synchronization failed"): + backend.close() + assert backend._status == "closed" + assert backend._levels == [] and backend._allocations == [] + assert backend._fine_curved is None and backend._fine_flags is None + assert backend._curved is None and backend._stream is None + backend.close() + stream.synchronize.assert_called_once_with() + soa.free.assert_called_once_with() + first.free.assert_called_once_with() + second.free.assert_called_once_with() diff --git a/research/fine_surface_20261014/incremental.diff b/research/fine_surface_20261014/incremental.diff new file mode 100644 index 0000000..318d92e --- /dev/null +++ b/research/fine_surface_20261014/incremental.diff @@ -0,0 +1,1099 @@ +--- a/src/CelerisLab/lbm/kernels/refinement.cu ++++ b/src/CelerisLab/lbm/kernels/refinement.cu +@@ -7,10 +7,17 @@ + #include "core/descriptors.cuh" + #include "core/layout.cuh" + #include "core/params.cuh" ++#include "core/flags.cuh" ++#include "core/obs.cuh" + #include "operators/macro.cuh" + #include "operators/collision_srt.cuh" + #include "streaming/pull_double_buffer.cuh" + #include "boundary/planar_velocity.cuh" ++#include "boundary/curved_boundary.cuh" ++ ++extern "C" { ++#include "step/curved_double.cu" ++} + + #if DIM != 2 || NQ != 9 || COLLISION_MODEL != 0 || STORE_PRECISION != 0 || USE_DDF_SHIFTING || USE_LES || STREAMING_MODEL != 0 + #error "Refinement requires unshifted FP32 D2Q9 SRT double buffers without LES" +@@ -48,14 +55,15 @@ + #endif + } + +-extern "C" __global__ void PatchFineStep(const float* in, float* out) { ++extern "C" __global__ void PatchFineStep(const float* in, float* out, const uint16_t* flags) { + unsigned int x, y; unsigned long k; + index_from_thread(x, y, k); + if (x >= NX || y >= NY) return; + float f[NQ]; + // Outer halo is invalid after EACH hop, including when reusing the buffer + // that held explosion data. Inner halo only streams; it never collides. +- if (x < 2 || y < 2 || x >= NX - 2 || y >= NY - 2) { ++ if (x < 2 || y < 2 || x >= NX - 2 || y >= NY - 2 ++ || (flags != nullptr && is_solid(flags[k]))) { + for (int q = 0; q < NQ; ++q) f[q] = NAN; + } else { + unsigned long j[NQ]; +--- a/src/CelerisLab/lbm/kernels/step/aux_kernels.cu ++++ b/src/CelerisLab/lbm/kernels/step/aux_kernels.cu +@@ -24,61 +24,7 @@ + #include "../streaming/esopull_semantic_helpers.cuh" + #include "../boundary/esopull_curved_helpers.cuh" + +-__device__ __forceinline__ float action_omega(const float* action, int body_id) +-{ +- if (action == nullptr || body_id < 0) return 0.0f; +- unsigned int base = (unsigned int)body_id * (unsigned int)OBS_BODY_SLOT_FLOATS; +- return action[base + (unsigned int)(OBS_BODY_SLOT_FLOATS - 1)]; +-} +- +-__global__ void CurvedBoundaryKernel( +- fpxx* fi, +- const unsigned int* cl_fluid_idx, +- const unsigned char* cl_dir, +- const float* cl_q, +- const float* cl_rx, +- const float* cl_ry, +- const float* cl_rz, +- const unsigned char* cl_fallback_class, +- const int* cl_body_id, +- const float* action, +- float* obs, +- unsigned int n_curved, +- const float* surface_velocity = nullptr, float* link_exchange = nullptr) +-{ +- unsigned int tid = threadIdx.x + blockIdx.x * blockDim.x; +- if (tid >= n_curved) return; +- +- const unsigned long k_f = (unsigned long)cl_fluid_idx[tid]; +- const unsigned int dir = (unsigned int)cl_dir[tid]; +- const float q = cl_q[tid]; +- const int bid = cl_body_id[tid]; +- const float rx = cl_rx[tid]; +- const float ry = cl_ry[tid]; +- const unsigned char fallback_class = cl_fallback_class[tid]; +- const float omega = action_omega(action, bid); +- +-#if DIM == 2 +- float Uw = -omega * ry; +- float Vw = omega * rx; +- if (surface_velocity != nullptr) { +- // Independent prescribed fluid velocity on fixed geometry. +- const float u = surface_velocity[2*tid], v = surface_velocity[2*tid+1]; +- if (u != 0.0f || v != 0.0f) { Uw += u; Vw += v; } +- } +- (void)cl_rz; +- apply_bouzidi_link(dir, q, k_f, fi, Uw, Vw, rx, ry, fallback_class, obs, bid, +- link_exchange == nullptr ? nullptr : link_exchange + 3*tid); +-#elif DIM == 3 +- const float rz = cl_rz[tid]; +- const float Uw = -omega * ry; +- const float Vw = omega * rx; +- const float Ww = 0.0f; +- apply_bouzidi_link(dir, q, k_f, fi, Uw, Vw, Ww, +- rx, ry, rz, fallback_class, obs, bid); +-#endif +-} +-// End of CurvedBoundaryKernel ++#include "curved_double.cu" + + // --------------------------------------------------------------------------- + // PrepareEsoPullCurvedKernel -- read-only curved prep for EsoPull +--- /dev/null ++++ b/src/CelerisLab/lbm/kernels/step/curved_double.cu +@@ -0,0 +1,61 @@ ++// Shared compact double-buffer curved boundary; caller supplies core/BFL headers. ++#ifndef CELERIS_CURVED_DOUBLE_CU ++#define CELERIS_CURVED_DOUBLE_CU ++ ++__device__ __forceinline__ float action_omega(const float* action, int body_id) ++{ ++ if (action == nullptr || body_id < 0) return 0.0f; ++ unsigned int base = (unsigned int)body_id * (unsigned int)OBS_BODY_SLOT_FLOATS; ++ return action[base + (unsigned int)(OBS_BODY_SLOT_FLOATS - 1)]; ++} ++ ++__global__ void CurvedBoundaryKernel( ++ fpxx* fi, ++ const unsigned int* cl_fluid_idx, ++ const unsigned char* cl_dir, ++ const float* cl_q, ++ const float* cl_rx, ++ const float* cl_ry, ++ const float* cl_rz, ++ const unsigned char* cl_fallback_class, ++ const int* cl_body_id, ++ const float* action, ++ float* obs, ++ unsigned int n_curved, ++ const float* surface_velocity = nullptr, float* link_exchange = nullptr) ++{ ++ unsigned int tid = threadIdx.x + blockIdx.x * blockDim.x; ++ if (tid >= n_curved) return; ++ ++ const unsigned long k_f = (unsigned long)cl_fluid_idx[tid]; ++ const unsigned int dir = (unsigned int)cl_dir[tid]; ++ const float q = cl_q[tid]; ++ const int bid = cl_body_id[tid]; ++ const float rx = cl_rx[tid]; ++ const float ry = cl_ry[tid]; ++ const unsigned char fallback_class = cl_fallback_class[tid]; ++ const float omega = action_omega(action, bid); ++ ++#if DIM == 2 ++ float Uw = -omega * ry; ++ float Vw = omega * rx; ++ if (surface_velocity != nullptr) { ++ // Independent prescribed fluid velocity on fixed geometry. ++ const float u = surface_velocity[2*tid], v = surface_velocity[2*tid+1]; ++ if (u != 0.0f || v != 0.0f) { Uw += u; Vw += v; } ++ } ++ (void)cl_rz; ++ apply_bouzidi_link(dir, q, k_f, fi, Uw, Vw, rx, ry, fallback_class, obs, bid, ++ link_exchange == nullptr ? nullptr : link_exchange + 3*tid); ++#elif DIM == 3 ++ const float rz = cl_rz[tid]; ++ const float Uw = -omega * ry; ++ const float Vw = omega * rx; ++ const float Ww = 0.0f; ++ apply_bouzidi_link(dir, q, k_f, fi, Uw, Vw, Ww, ++ rx, ry, rz, fallback_class, obs, bid); ++#endif ++} ++// End of CurvedBoundaryKernel ++ ++#endif +--- a/src/CelerisLab/lbm/refinement.py ++++ b/src/CelerisLab/lbm/refinement.py +@@ -1,9 +1,9 @@ +-"""CPU preparation for one fixed D2Q9 2:1 patch; no coupled stepper yet. ++"""CPU preparation for one fixed D2Q9 2:1 patch and optional interior circles. + + Cell indices use y*nx+x; population slots use q*(nx*ny)+cell, matching + core/layout.cuh. Bounds are half-open (x0, y0, x1, y1) in coarse cells. + The four fine halo cells implement the pinned CPUREF volumetric geometry. +-Topology does not encode physical boundary conditions or obstacle safety. ++Base topology is independent of boundaries; prepare_fine_boundary checks them. + """ + from dataclasses import dataclass, replace + from numbers import Integral +@@ -11,7 +11,7 @@ + import numpy as np + + from ..config import LBMConfig +-from .descriptors import D2Q9_EX, D2Q9_EY ++from .descriptors import D2Q9_EX, D2Q9_EY, FLUID, SOLID + + ACTIVE, INNER_GHOST, OUTER_GHOST = 0, 1, 2 + HALO = 4 +@@ -136,3 +136,157 @@ + raise ValueError("step counts must be nonnegative integers") + if fine_steps != 2 * coarse_steps: + raise ValueError("levels are not synchronized: fine_steps must equal 2*coarse_steps") ++ ++ ++@dataclass(frozen=True, eq=False) ++class FineBoundary2D: ++ """Fixed local projection plus auditable, finite transfer dependency sets. ++ ++ transfer_reads rows are (hop, direction, cell), traced from coalescence at ++ hop 2 back to exploded G at hop 0. No previous coarse interval is traversed. ++ Cell footprints also include the whole explosion write/donor tables. ++ """ ++ objects: tuple ++ flags: np.ndarray ++ curved_host: tuple ++ boundary_cells: np.ndarray ++ transfer_fine_cells: np.ndarray ++ transfer_coarse_cells: np.ndarray ++ transfer_reads: np.ndarray ++ ++ ++def _transfer_footprint(patch): ++ ny, nx = patch.fine_shape ++ cells = nx * ny ++ pending = [(2, *divmod(int(slot), cells)) for slot in patch.coalesce_fine.ravel()] ++ reads = set() ++ while pending: ++ hop, q, k = pending.pop() ++ if (hop, q, k) in reads: ++ continue ++ reads.add((hop, q, k)) ++ if hop == 0: ++ continue ++ y, x = divmod(k, nx) ++ kind = patch.fine_kind[y, x] ++ if kind == OUTER_GHOST: ++ raise ValueError("Transfer reads an invalid post-hop outer ghost") ++ # A collided output depends on all nine arrivals; ghosts only stream. ++ for direction in (range(9) if kind == ACTIVE else (q,)): ++ sx, sy = x - D2Q9_EX[direction], y - D2Q9_EY[direction] ++ if not (0 <= sx < nx and 0 <= sy < ny): ++ raise ValueError("Transfer dependency leaves the fine allocation") ++ pending.append((hop - 1, direction, sy * nx + sx)) ++ fine = set(map(int, patch.ghost_fine)) | {k for _, _, k in reads} ++ coarse = set(map(int, patch.ghost_coarse)) | set(map( ++ int, patch.coalesce_coarse % np.prod(patch.coarse_shape))) ++ return fine, coarse, _readonly(sorted(reads), np.int64) ++ ++ ++def prepare_fine_boundary(cfg, patch, objects, *, wall_aware=False): ++ """Project fixed circles and reject boundary/transfer overlap before CUDA. ++ ++ Input centers/radii are in coarse physical coordinates (dx=dt=1). ++ SurfaceActuation retains its lattice-velocity meaning: input coarse units ++ are converted into independent fine-local objects with dx=dt=.5. ++ Original objects are not retained or mutated. No runtime geometry updates. ++ """ ++ if not objects: ++ return None ++ checked = replace(cfg) ++ checked.validate() ++ if (patch.coarse_shape != (cfg.ny, cfg.nx) or not checked.is_d2q9 ++ or checked.collision != "SRT" or checked.streaming != "double_buffer" ++ or checked.store_precision != "FP32" or checked.ddf_shifting or checked.les_enabled ++ or patch.tau_coarse != 3*checked.viscosity+.5): ++ raise ValueError("Fine boundary requires the matching fixed-patch configuration") ++ from ..body.geometry.circle import CircleGeometry ++ from ..body.objects import SimObject ++ from ..body.coupling.soa_packer import pack_cut_links_to_soa ++ ++ ny, nx = patch.fine_shape ++ fine_cfg = replace(cfg, nx=nx, ny=ny, viscosity=2 * cfg.viscosity) ++ flags = np.full(nx * ny, FLUID, np.uint16) ++ active = patch.fine_kind.ravel() == ACTIVE ++ local, links = [], [] ++ x0, y0, x1, y1 = patch.bounds ++ dx = dt = .5 ++ for bid, obj in enumerate(objects): ++ if (type(obj.geometry) is not CircleGeometry or obj.is_sensor or obj.is_force_region ++ or any(getattr(obj.state, name) != 0 for name in ("vx", "vy", "omega")) ++ or any(vars(obj.control).values())): ++ raise ValueError("Fine boundaries require stationary circles without other roles") ++ cx, cy = obj.geometry.center ++ radius = obj.geometry._radius ++ if (not np.isfinite([cx, cy, radius]).all() or radius <= 0 ++ or cx-radius < x0 or cx+radius > x1 or cy-radius < y0 or cy+radius > y1): ++ raise ValueError("Entire fine circle must lie inside the physical patch") ++ center = tuple((v-o)/dx-.5 for v, o in zip((cx, cy), patch.fine_origin)) ++ spec = obj.surface_actuation ++ if spec is not None: ++ spec = replace(spec, normal_velocity=spec.normal_velocity * dt / dx) ++ item = SimObject(bid, geometry=CircleGeometry(*center, radius/dx), ++ center=center, radius=radius/dx, surface_actuation=spec) ++ item.validate_surface_actuation(fine_cfg) ++ mask = item.get_flag_mask(nx, ny) ++ solid = (mask & SOLID) != 0 ++ if not solid.any() or np.any(solid & ~active) or np.any(flags[solid] & SOLID): ++ raise ValueError("Fine solids must be resolved, disjoint and entirely active") ++ flags[solid] = mask[solid] ++ local.append(item) ++ for item in local: ++ cut = item.geometry.build_cut_links(nx, ny, domain_flags=flags) ++ if not cut: ++ raise ValueError("Fine circle has no resolved cut links") ++ if item.surface_actuation is not None: ++ _, aperture = item.surface_actuation.project( ++ np.array([link.rx for link in cut], np.float32), ++ np.array([link.ry for link in cut], np.float32)) ++ if not aperture.any(): ++ raise ValueError("Surface aperture hits no resolved cut links") ++ for link in cut: ++ link.body_id = item.obj_id ++ links.extend(cut) ++ ++ boundary, writers, receivers = set(), set(), set() ++ for link in links: ++ r, q = link.fluid_idx, link.dir ++ y, x = divmod(r, nx) ++ sx, sy = x + D2Q9_EX[q], y + D2Q9_EY[q] ++ s = sy * nx + sx ++ if not (active[r] and flags[r] & FLUID and active[s] and flags[s] & SOLID): ++ raise ValueError("Cut-link receiver/source must be active fluid/solid") ++ writer = (s, q+1 if q % 2 else q-1) ++ if writer in writers: ++ raise ValueError("Duplicate fine boundary writer") ++ writers.add(writer) ++ receivers.add((r, q)) ++ boundary.update((r, s)) ++ if link.q < .5: ++ dx_, dy_ = x - D2Q9_EX[q], y - D2Q9_EY[q] ++ if not (0 <= dx_ < nx and 0 <= dy_ < ny and active[dy_*nx+dx_]): ++ raise ValueError("q<.5 donor crosses the fine active interface; fallback cannot hide it") ++ boundary.add(dy_*nx+dx_) ++ # Reverse coverage: every fluid pull across a solid neighbor needs a writer. ++ required = set() ++ for r in np.flatnonzero(active & ((flags & FLUID) != 0)): ++ for q in range(1, 9): ++ if flags[r + D2Q9_EX[q] + nx*D2Q9_EY[q]] & SOLID: ++ required.add((int(r), q)) ++ if required != receivers: ++ raise ValueError("Fine solid pull coverage does not match the cut links") ++ fine, coarse, reads = _transfer_footprint(patch) ++ if fine & (boundary | set(map(int, np.flatnonzero(flags & SOLID)))): ++ raise ValueError("Boundary stencil overlaps the two-hop transfer footprint") ++ for k in coarse: ++ y, x = divmod(k, cfg.nx) ++ if x0 <= x < x1 and y0 <= y < y1: ++ raise ValueError("Transfer coarse donor/target is not an uncovered bulk cell") ++ # Coarse reconstruction targets y=1,ny-2 pull from y=0..2,ny-3..ny-1. ++ if wall_aware and (y <= 2 or y >= cfg.ny-3): ++ raise ValueError("Transfer footprint touches the coarse wall reconstruction stencil") ++ return FineBoundary2D(tuple(local), _readonly(flags, np.uint16), ++ tuple(_readonly(a, a.dtype) for a in pack_cut_links_to_soa(links)), ++ _readonly(sorted(boundary), np.uint32), ++ _readonly(sorted(fine), np.uint32), ++ _readonly(sorted(coarse), np.uint32), reads) +--- a/src/CelerisLab/lbm/refinement_stepper.py ++++ b/src/CelerisLab/lbm/refinement_stepper.py +@@ -1,5 +1,5 @@ + # CelerisLab/lbm/refinement_stepper.py +-"""Opt-in fixed patch backend; no Simulation/objects adapter. ++"""Opt-in fixed patch backend with optional stationary fine-interior circles. + + The caller owns the CudaContext and must close this backend before that context. + Only synchronized postcollision_g leaf populations are public. No checkpoint, +@@ -14,7 +14,8 @@ + import pycuda.driver as cuda + + from ..cuda import compiler_v2 as compiler +-from .refinement import ACTIVE, HALO, FixedPatch2D ++from .refinement import ACTIVE, HALO, FixedPatch2D, prepare_fine_boundary ++from .descriptors import SOLID + + + @dataclass +@@ -33,7 +34,11 @@ + ``coarse_boundary`` is ``periodic`` (default) or ``slot_reservoir``: + a bottom on-site slot and top fixed-density reservoir from ``cfg``. + Periodic mode does not apply the wall/slot boundary fields in ``cfg``. +- Physical walls remain coarse; fine halo donors must be ordinary fluid. ++ Outer walls remain coarse; fine halo donors must be ordinary fluid. ++ ``fine_objects`` accepts fixed circles in coarse physical coordinates; ++ velocities are in coarse lattice units (dx=dt=1). Independent local copies ++ are projected at fine cell centers. Their complete stencil must be active ++ and disjoint from the actual two-hop transfer footprint. + + ``initialize(coarse_g, fine_g)`` accepts physical Q-major (9,ny,nx) arrays + already in postcollision phase. It does not collide or build channel flags. +@@ -41,7 +46,7 @@ + On a device/launch failure the instance becomes unusable: close and recreate + it, rather than pretending the partially advanced fine buffer rolled back. + """ +- def __init__(self, cfg, bounds, *, context, coarse_boundary="periodic"): ++ def __init__(self, cfg, bounds, *, context, coarse_boundary="periodic", fine_objects=()): + if HALO != 4: + raise RuntimeError("refinement.cu requires a four-cell fine halo") + if coarse_boundary not in ("periodic", "slot_reservoir"): +@@ -55,6 +60,11 @@ + "velocity=0 and 2 <= wall_slot_width < nx") + if self.patch.bounds[1] < 4 or self.patch.bounds[3] > cfg.ny - 4: + raise ValueError("slot_reservoir requires y0 >= 4 and y1 <= ny-4") ++ self.fine_boundary = prepare_fine_boundary( ++ cfg, self.patch, tuple(fine_objects), wall_aware=self._wall_aware) ++ self._fine_leaf = self.patch.fine_kind == ACTIVE ++ if self.fine_boundary is not None: ++ self._fine_leaf &= (self.fine_boundary.flags.reshape(self.patch.fine_shape) & SOLID) == 0 + self.ctx = context + self._lock = RLock() + self._status = "new" +@@ -62,6 +72,7 @@ + self._allocations = [] + self._levels = [] + self._stream = None ++ self._fine_flags = self._fine_curved = self._curved = None + self._block = (cfg.threads_per_block, 1, 1) + fine_cfg = replace(cfg, nx=self.patch.fine_shape[1], ny=self.patch.fine_shape[0], + viscosity=2 * cfg.viscosity) +@@ -76,7 +87,9 @@ + config.validate() + if not np.isclose(config.omega, 1 / tau, rtol=1e-14, atol=0): + raise RuntimeError("level omega/tau mismatch") +- build = compiler.generate_config(config, n_objects=0) ++ n_objects = (len(self.fine_boundary.objects) ++ if name == "PatchFineStep" and self.fine_boundary is not None else 0) ++ build = compiler.generate_config(config, n_objects=n_objects) + try: + ptx = compiler.compile_kernel(self.ctx.sm_arch, source="refinement.cu", + build_dir=build) +@@ -86,7 +99,7 @@ + ptr, size = module.get_global("d_params") + if size != struct.calcsize("=ffffI"): + raise RuntimeError("LBMParams host/device layout mismatch") +- cuda.memcpy_htod(ptr, struct.pack("=ffffI", config.omega, 0, 0, 0, 0)) ++ cuda.memcpy_htod(ptr, struct.pack("=ffffI", config.omega, 0, 0, 0, n_objects)) + shape = (9, config.ny, config.nx) + size = int(np.prod(shape)) * 4 + self._levels.append(_Level(shape, module, self._allocate(size), +@@ -100,6 +113,16 @@ + self._targets = self._upload(p.coalesce_coarse[order]) + self._children = self._upload(p.coalesce_fine[order]) + self._explode = self._levels[1].module.get_function("PatchExplode") ++ if self.fine_boundary is not None: ++ from .curved_links import CurvedLinkSoA ++ boundary = self.fine_boundary ++ self._fine_flags = self._upload(boundary.flags) ++ # SoA owns its allocations; never also register them in _allocations. ++ self._fine_curved = CurvedLinkSoA() ++ self._fine_curved.assign_host(*boundary.curved_host) ++ self._fine_curved.assign_surface(boundary.objects, fine_cfg, boundary.flags) ++ self._fine_curved.upload() ++ self._curved = self._levels[1].module.get_function("CurvedBoundaryKernel") + except BaseException: + try: + self.close() +@@ -131,7 +154,7 @@ + coarse[:, y0:y1, x0:x1] = np.nan + if self._wall_aware: + coarse[:, (0, -1), :] = np.nan +- fine[:, self.patch.fine_kind != ACTIVE] = np.nan ++ fine[:, ~self._fine_leaf] = np.nan + + def initialize(self, coarse_g, fine_g): + """Upload an explicit G_0; invalid non-leaves are discarded.""" +@@ -146,7 +169,7 @@ + leaf[y0:y1, x0:x1] = False + if self._wall_aware: + leaf[[0, -1]] = False +- for array, mask in zip(arrays, (leaf, self.patch.fine_kind == ACTIVE)): ++ for array, mask in zip(arrays, (leaf, self._fine_leaf)): + if not np.isfinite(array[:, mask]).all() or (array[:, mask].sum(axis=0) <= 0).any(): + raise ValueError("Leaf populations must be finite with positive density") + self._mask_nonleaves(*arrays) +@@ -154,11 +177,32 @@ + for level, array in zip(self._levels, arrays): + cuda.memcpy_htod(level.current, array) + cuda.memcpy_htod(level.spare, array) ++ if self._fine_curved is not None and self._fine_curved.link_exchange_gpu is not None: ++ cuda.memset_d8(self._fine_curved.link_exchange_gpu, 0, self._fine_curved.count * 12) + self._step_count = 0 + self._status = "ready" + except BaseException: + self._status = "failed" + raise ++ ++ def _apply_fine_boundary(self, buffer, **kw): ++ """Stage solid source slots; exchange buffer holds this fine substep only.""" ++ cl = self._fine_curved ++ if cl is None: ++ if self.fine_boundary is not None: ++ raise RuntimeError("Fine boundary device buffers are missing") ++ return ++ if self._curved is None or cl.fluid_idx_gpu is None: ++ raise RuntimeError("Fine boundary device buffers are missing") ++ driven = any(obj.surface_actuation is not None for obj in self.fine_boundary.objects) ++ if driven and (cl.surface_velocity_gpu is None or cl.link_exchange_gpu is None): ++ raise RuntimeError("Surface boundary device buffers are missing") ++ self._curved(buffer, cl.fluid_idx_gpu, cl.dir_gpu, cl.q_gpu, ++ cl.rx_gpu, cl.ry_gpu, cl.rz_gpu, cl.fallback_class_gpu, cl.body_id_gpu, ++ np.uintp(0), np.uintp(0), np.uint32(cl.count), ++ cl.surface_velocity_gpu if cl.surface_velocity_gpu is not None else np.uintp(0), ++ cl.link_exchange_gpu if cl.link_exchange_gpu is not None else np.uintp(0), ++ grid=((cl.count + self._block[0] - 1) // self._block[0], 1), **kw) + + def step(self, n=1): + """Advance G→G: one explosion, two fine collisions, one coarse collision.""" +@@ -176,8 +220,13 @@ + np.uint32(len(p.ghost_fine)), np.uint64(np.prod(p.coarse_shape)), + grid=((len(p.ghost_fine) + self._block[0] - 1) // self._block[0], 1), + **kw) +- f.kernel(f.current, f.spare, grid=f.grid, **kw) +- f.kernel(f.spare, f.current, grid=f.grid, **kw) ++ flags = self._fine_flags if self._fine_flags is not None else np.uintp(0) ++ if self.fine_boundary is not None and self._fine_flags is None: ++ raise RuntimeError("Fine boundary flags are missing") ++ self._apply_fine_boundary(f.current, **kw) ++ f.kernel(f.current, f.spare, flags, grid=f.grid, **kw) ++ self._apply_fine_boundary(f.spare, **kw) ++ f.kernel(f.spare, f.current, flags, grid=f.grid, **kw) + c.kernel(c.current, c.spare, f.current, self._targets, self._children, + np.uint32(len(p.coalesce_coarse)), + *(np.uint32(v) for v in p.bounds), np.uint32(self._wall_aware), +@@ -220,6 +269,13 @@ + error = exc + self._levels.clear() + self._explode = None ++ if getattr(self, "_fine_curved", None) is not None: ++ try: ++ self._fine_curved.free() ++ except Exception as exc: ++ error = error or exc ++ self._fine_curved = None ++ self._curved = self._fine_flags = None + for pointer in self._allocations: + try: + pointer.free() +--- a/src/CelerisLab/lbm/stepper.py ++++ b/src/CelerisLab/lbm/stepper.py +@@ -147,13 +147,17 @@ + ) + else: + assert cl.fluid_idx_gpu is not None ++ if cl.surface_velocity is not None and ( ++ cl.surface_velocity_gpu is None or cl.link_exchange_gpu is None): ++ raise RuntimeError("Surface boundary device buffers are missing") + self.curved_fn( + f.ddf_gpu, + cl.fluid_idx_gpu, cl.dir_gpu, cl.q_gpu, + cl.rx_gpu, cl.ry_gpu, cl.rz_gpu, cl.fallback_class_gpu, cl.body_id_gpu, + action_gpu, obs_gpu, + np.uint32(f.n_curved), +- cl.surface_velocity_gpu or np.uintp(0), cl.link_exchange_gpu or np.uintp(0), ++ cl.surface_velocity_gpu if cl.surface_velocity_gpu is not None else np.uintp(0), ++ cl.link_exchange_gpu if cl.link_exchange_gpu is not None else np.uintp(0), + block=(tpb, 1, 1), grid=grid_c, + **launch_kw, + ) +--- /dev/null ++++ b/tests/unit/test_fine_surface.py +@@ -0,0 +1,215 @@ ++"""CPU-only fine circle projection and transfer/boundary isolation contracts.""" ++from dataclasses import asdict, replace ++ ++import numpy as np ++import pytest ++ ++from CelerisLab.body.geometry.circle import CircleGeometry ++from CelerisLab.body.objects import SimObject, SurfaceActuation ++from CelerisLab.config import LBMConfig ++from CelerisLab.lbm import refinement ++from CelerisLab.lbm.descriptors import D2Q9_EX, D2Q9_EY, FLUID, SOLID ++from CelerisLab.lbm.refinement import ACTIVE, INNER_GHOST, FixedPatch2D ++ ++ ++def setup_patch(): ++ cfg = LBMConfig(nx=24, ny=24, viscosity=.05) ++ cfg.validate() ++ return cfg, FixedPatch2D.from_config(cfg, (4, 4, 20, 20)) ++ ++ ++def circle(center=(12.25, 12.25), radius=2.15, speed=.002): ++ return SimObject(0, geometry=CircleGeometry(*center, radius), center=center, ++ radius=radius, surface_actuation=SurfaceActuation(.7, .85, speed)) ++ ++ ++@pytest.mark.parametrize('speed', [.002, -.002]) ++def test_fine_projection_uses_cell_center_bridge_and_preserves_source(speed): ++ cfg, patch = setup_patch() ++ source = circle(center=(12.25, 12.25 if speed > 0 else 11.75), speed=speed) ++ expected_center = (20., 20. if speed > 0 else 19.) ++ assert patch.fine_origin == (2., 2.) ++ before = (source.center, source.radius, source.geometry.center, ++ source.geometry._radius, asdict(source.state), asdict(source.surface_actuation), ++ vars(cfg).copy()) ++ plan = refinement.prepare_fine_boundary(cfg, patch, [source]) ++ local, = plan.objects ++ assert local is not source and local.geometry is not source.geometry ++ np.testing.assert_allclose(local.center, expected_center, rtol=0, atol=1e-14) ++ np.testing.assert_allclose(local.geometry.center, expected_center, rtol=0, atol=1e-14) ++ assert local.radius == pytest.approx(4.3) ++ assert local.geometry._radius == pytest.approx(4.3) ++ assert local.surface_actuation.normal_velocity == speed # dt/dx is unchanged. ++ assert (source.center, source.radius, source.geometry.center, ++ source.geometry._radius, asdict(source.state), asdict(source.surface_actuation), ++ vars(cfg).copy()) == before ++ _, _, _, _, rx, ry, _, _ = plan.curved_host ++ np.testing.assert_allclose(np.hypot(rx, ry), 4.3, rtol=0, atol=6e-7) ++ # These world points lie on the ORIGINAL physical circle, including the +.5. ++ world_x = patch.fine_origin[0]+.5*(local.center[0]+rx.astype(float)+.5) ++ world_y = patch.fine_origin[1]+.5*(local.center[1]+ry.astype(float)+.5) ++ np.testing.assert_allclose(np.hypot(world_x-source.center[0], world_y-source.center[1]), ++ source.radius, rtol=0, atol=3e-7) ++ ++ ++def test_fine_boundary_receivers_sources_and_reverse_coverage(): ++ cfg, patch = setup_patch() ++ plan = refinement.prepare_fine_boundary(cfg, patch, [circle()]) ++ ny, nx = patch.fine_shape ++ flags = plan.flags ++ assert flags.shape == (nx*ny,) and flags.dtype == np.uint16 ++ solid = (flags & SOLID) != 0 ++ assert solid.any() ++ assert np.all(patch.fine_kind.ravel()[solid] == ACTIVE) ++ receivers, directions, q, _, _, _, _, fallback = plan.curved_host ++ cx, cy = np.asarray(D2Q9_EX), np.asarray(D2Q9_EY) ++ sources = receivers.astype(np.int64)+cx[directions]+nx*cy[directions] ++ assert np.all((flags[receivers] & FLUID) != 0) ++ assert not np.any(flags[receivers] & SOLID) ++ assert np.all(solid[sources]) ++ assert np.all(patch.fine_kind.ravel()[receivers] == ACTIVE) ++ assert np.all(patch.fine_kind.ravel()[sources] == ACTIVE) ++ # A source population slot has a unique writer, not just a unique cell. ++ assert len(set(zip(sources.tolist(), directions.tolist()))) == len(receivers) ++ expected = set() ++ for cell in np.flatnonzero((patch.fine_kind.ravel() == ACTIVE) & ~solid): ++ y, x = divmod(int(cell), nx) ++ for direction in range(1, 9): ++ sx, sy = x+int(cx[direction]), y+int(cy[direction]) ++ if 0 <= sx < nx and 0 <= sy < ny and solid[sy*nx+sx]: ++ expected.add((int(cell), direction)) ++ assert set(zip(receivers.tolist(), directions.tolist())) == expected ++ donors = receivers[q < .5].astype(np.int64)-cx[directions[q < .5]]-nx*cy[directions[q < .5]] ++ assert np.all(patch.fine_kind.ravel()[donors] == ACTIVE) ++ assert not np.any(solid[donors]) ++ assert not fallback.any() ++ stencil = set(receivers.tolist()) | set(sources.tolist()) | set(donors.tolist()) ++ assert stencil == set(plan.boundary_cells.tolist()) ++ assert not set(plan.boundary_cells.tolist()) & set(plan.transfer_fine_cells.tolist()) ++ assert not set(np.flatnonzero(solid).tolist()) & set(plan.transfer_fine_cells.tolist()) ++ ++ ++def test_transfer_dependencies_follow_two_pulls_and_expand_active_collision(): ++ cfg, patch = setup_patch() ++ plan = refinement.prepare_fine_boundary(cfg, patch, [circle()]) ++ ny, nx = patch.fine_shape ++ cells = nx*ny ++ # Closed form for exactly two hops, independent of the production traversal: ++ # the final inner ghost only pulls; its predecessor may have collided. ++ offsets = np.asarray(D2Q9_EX)+nx*np.asarray(D2Q9_EY) ++ visited = set() ++ for slot in patch.coalesce_fine.ravel(): ++ direction, target = divmod(int(slot), cells) ++ assert patch.fine_kind.ravel()[target] == INNER_GHOST ++ middle = target-int(offsets[direction]) ++ visited.update(((2, direction, target), (1, direction, middle))) ++ if patch.fine_kind.ravel()[middle] == ACTIVE: ++ visited.update((0, q, middle-int(offsets[q])) for q in range(9)) ++ else: ++ assert patch.fine_kind.ravel()[middle] == INNER_GHOST ++ visited.add((0, direction, middle-int(offsets[direction]))) ++ actual = {tuple(map(int, row)) for row in plan.transfer_reads} ++ assert actual == visited ++ assert len(plan.transfer_reads) == len(visited) ++ expected_fine = set(patch.ghost_fine.tolist()) | {cell for _, _, cell in visited} ++ expected_coarse = set(patch.ghost_coarse.tolist()) | set( ++ (patch.coalesce_coarse % (cfg.nx*cfg.ny)).tolist()) ++ assert set(plan.transfer_fine_cells.tolist()) == expected_fine ++ assert set(plan.transfer_coarse_cells.tolist()) == expected_coarse ++ for coarse_slot, children in zip(patch.coalesce_coarse, patch.coalesce_fine): ++ coarse_q, coarse_cell = divmod(int(coarse_slot), cfg.nx*cfg.ny) ++ coarse_y, coarse_x = divmod(coarse_cell, cfg.nx) ++ fine_q, fine_cell = np.divmod(children, cells) ++ np.testing.assert_array_equal(fine_q, coarse_q) ++ fine_y, fine_x = np.divmod(fine_cell, nx) ++ physical_centers = np.column_stack(( ++ patch.fine_origin[0]+.5*(fine_x+.5), ++ patch.fine_origin[1]+.5*(fine_y+.5))) ++ np.testing.assert_array_equal(physical_centers.mean(axis=0), ++ (coarse_x+.5, coarse_y+.5)) ++ # This case must exercise the collision fan-in, not only ghost straight lines. ++ active_middle = [(q, cell) for stage, q, cell in visited ++ if stage == 1 and patch.fine_kind.ravel()[cell] == ACTIVE] ++ assert active_middle ++ _, sample = active_middle[0] ++ for incoming in range(9): ++ source = sample-int(D2Q9_EX[incoming])-nx*int(D2Q9_EY[incoming]) ++ assert (0, incoming, source) in actual ++ ++ ++def test_fine_plan_arrays_are_readonly_and_contiguous(): ++ cfg, patch = setup_patch() ++ plan = refinement.prepare_fine_boundary(cfg, patch, [circle()]) ++ assert len(plan.curved_host) == 8 ++ for array in (plan.flags, *plan.curved_host, plan.boundary_cells, ++ plan.transfer_fine_cells, plan.transfer_coarse_cells, plan.transfer_reads): ++ assert array.flags.c_contiguous and not array.flags.writeable ++ assert array.size ++ with pytest.raises(ValueError): ++ array.flat[0] = array.flat[0] ++ ++ ++def test_empty_objects_keep_existing_refinement_path(): ++ cfg, patch = setup_patch() ++ assert refinement.prepare_fine_boundary(cfg, patch, []) is None ++ ++ ++def test_fine_rejects_cross_level_low_q_donor_without_fallback(): ++ cfg, patch = setup_patch() ++ source = circle(center=(5.05, 12.25), radius=.7) ++ # In fine coordinates C=(5.6,20), R=1.4. Receiver (4,20), dir +x ++ # has q=.2, but its required reverse donor (3,20) is not active. ++ local = CircleGeometry(5.6, 20., 1.4) ++ links = local.build_cut_links(patch.fine_shape[1], patch.fine_shape[0]) ++ target, = [link for link in links if link.fluid_idx == 20*40+4 and link.dir == 1] ++ assert target.q == pytest.approx(.2) ++ assert patch.fine_kind[20, 3] != ACTIVE ++ with pytest.raises(ValueError): ++ refinement.prepare_fine_boundary(cfg, patch, [source]) ++ ++ ++def test_fine_rejects_active_stencil_that_still_touches_transfer(): ++ cfg, patch = setup_patch() ++ source = circle(center=(6.05, 12.25), radius=.7) ++ # Move the cross-level example two fine cells inward: all boundary reads ++ # are now active, but the q=.2 reverse donor is still a transfer dependency. ++ local = CircleGeometry(7.6, 20., 1.4) ++ nx = patch.fine_shape[1] ++ solid = (local.build_flag_mask(nx, patch.fine_shape[0]) & SOLID) != 0 ++ assert np.all(patch.fine_kind.ravel()[solid] == ACTIVE) ++ links = local.build_cut_links(nx, patch.fine_shape[0]) ++ stencil = set() ++ for link in links: ++ offset = int(D2Q9_EX[link.dir])+nx*int(D2Q9_EY[link.dir]) ++ stencil.update((link.fluid_idx, link.fluid_idx+offset)) ++ if link.q < .5: ++ stencil.add(link.fluid_idx-offset) ++ assert np.all(patch.fine_kind.ravel()[list(stencil)] == ACTIVE) ++ with pytest.raises(ValueError, match='transfer footprint'): ++ refinement.prepare_fine_boundary(cfg, patch, [source]) ++ ++ ++@pytest.mark.parametrize('change', [dict(nx=25), dict(collision='TRT'), dict(viscosity=.06)]) ++def test_fine_rejects_mismatched_patch_configuration(change): ++ cfg, patch = setup_patch() ++ with pytest.raises(ValueError, match='matching'): ++ refinement.prepare_fine_boundary(replace(cfg, **change), patch, [circle()]) ++ ++ ++def test_fine_rejects_nonzero_control_even_without_motion(): ++ cfg, patch = setup_patch() ++ obj = circle() ++ obj.control.ax = .001 ++ with pytest.raises(ValueError, match='stationary'): ++ refinement.prepare_fine_boundary(cfg, patch, [obj]) ++ ++ ++@pytest.mark.parametrize('objects', [ ++ [circle(center=(4.25, 12.25), radius=1.)], ++ [circle(center=(12.5, 12.5), radius=.05)], ++ [circle(), circle(center=(13., 12.25))], ++]) ++def test_fine_rejects_ghost_solids_unresolved_circle_and_overlap(objects): ++ cfg, patch = setup_patch() ++ with pytest.raises(ValueError): ++ refinement.prepare_fine_boundary(cfg, patch, objects) +--- /dev/null ++++ b/tests/validation/multigrid/test_fine_surface_gpu.py +@@ -0,0 +1,330 @@ ++"""Two coarse/four fine steps: isolated fine circle, no flux-accuracy claim. ++ ++Run only through the bounded GPU runner after a fresh resource check. The test ++hooks read actual kernel inputs/outputs; they never change the stepping order. ++""" ++import importlib.util ++from contextlib import nullcontext ++from pathlib import Path ++from threading import RLock ++from types import SimpleNamespace ++from unittest.mock import Mock, patch ++ ++import numpy as np ++import pycuda.driver as cuda ++import pytest ++ ++import CelerisLab ++from CelerisLab.body.geometry.circle import CircleGeometry ++from CelerisLab.body.objects import SimObject ++from CelerisLab.config import LBMConfig ++from CelerisLab.cuda import compiler_v2 as compiler ++from CelerisLab.cuda.context import CudaContext ++from CelerisLab.lbm import refinement_stepper as implementation ++from CelerisLab.lbm.descriptors import FLUID, SOLID ++ ++ ++ROOT = Path(__file__).resolve().parents[3] ++CX = np.array([0, 1, -1, 0, 0, 1, -1, 1, -1]) ++CY = np.array([0, 0, 0, 1, -1, 1, -1, -1, 1]) ++OPP = np.array([0, 2, 1, 4, 3, 6, 5, 8, 7]) ++W = np.array([4/9]+[1/9]*4+[1/36]*4) ++MOMENTS = np.stack((np.ones(9), CX, CY)) ++GEOMETRY = ("fluid_idx", "dir", "q", "body_id", "rx", "ry", "rz", "fallback_class") ++BOUNDS = (4, 4, 20, 20) ++ ++ ++def read(pointer, shape, dtype=np.float32): ++ values = np.empty(shape, dtype) ++ cuda.memcpy_dtoh(values, pointer) ++ return values ++ ++ ++def rest(shape): ++ return np.broadcast_to(W[:, None, None], (9, *shape)).astype(np.float32).copy() ++ ++ ++def surface(speed): ++ return None if speed is None else dict(angle=.7, half_width=.85, normal_velocity=speed) ++ ++ ++def object_spec(speed): ++ return SimObject(0, CircleGeometry(12.25, 12.25, 2.15), center=(12.25, 12.25), ++ radius=2.15, surface_actuation=surface(speed)) ++ ++ ++def audit_compiler(original): ++ def compile_private(*args, **kwargs): ++ entry = Path(kwargs["build_dir"])/"fine_surface_audit.cu" ++ entry.write_text('#define CELERIS_REFINEMENT_AUDIT\n#include "refinement.cu"\n') ++ kwargs["source"] = entry.name ++ return original(*args, **kwargs) ++ return compile_private ++ ++ ++def reflection_oracle(before, cl, speed, *, verify_projection=True): ++ """FP64 BFL from frozen spatial populations, independent arc projection.""" ++ flat = before.astype(float).reshape(9, -1) ++ radius = np.hypot(cl.rx.astype(float), cl.ry.astype(float)) ++ delta = (np.arctan2(cl.ry.astype(float), cl.rx.astype(float))-.7+np.pi) % (2*np.pi)-np.pi ++ amplitude = 0 if speed is None else speed ++ strength = amplitude*np.maximum(0, 1-(delta/.85)**2)**2 ++ velocity = strength[:, None]*np.column_stack((cl.rx, cl.ry))/radius[:, None] ++ if verify_projection and cl.surface_velocity is not None: ++ np.testing.assert_allclose(cl.surface_velocity, velocity, atol=3e-9, rtol=0) ++ incoming = [] ++ for i, (k, d, q, fallback) in enumerate(zip(cl.fluid_idx, cl.dir, cl.q, cl.fallback_class)): ++ k, d, q = int(k), int(d), float(q) ++ rho = flat[:, k].sum() ++ dot = CX[d]*velocity[i, 0]+CY[d]*velocity[i, 1] ++ if fallback: ++ value = flat[d, k]-6*W[d]*rho*dot ++ elif q < .5: ++ value = 2*q*flat[d, k]+(1-2*q)*flat[d, k-CX[d]-40*CY[d]]-6*W[d]*rho*dot ++ else: ++ value = flat[d, k]/(2*q)+(1-1/(2*q))*flat[OPP[d], k]-3*W[d]*rho*dot/q ++ incoming.append(value) ++ return np.array(incoming) ++ ++ ++def fine_flux(before, staged, active, solid): ++ """Population ledger across the fine leaf boundary: solid versus halo. ++ ++ Internal fluid-to-fluid streaming cancels pairwise; solid and halo packets ++ are counted in their actual direction, before any collision. ++ """ ++ boundary, transfer = np.zeros(9), np.zeros(9) ++ magnitude = 0.0 ++ for d, (cx, cy) in enumerate(zip(CX, CY)): ++ incoming = active & ~np.roll(active, (cy, cx), (0, 1)) ++ outgoing = active & ~np.roll(active, (-cy, -cx), (0, 1)) ++ from_solid = np.roll(solid, (cy, cx), (0, 1)) ++ into_solid = np.roll(solid, (-cy, -cx), (0, 1)) ++ received = np.roll(staged[d], (cy, cx), (0, 1)).astype(float) ++ sent = before[d].astype(float) ++ for vector, inc, out in ((boundary, incoming & from_solid, outgoing & into_solid), ++ (transfer, incoming & ~from_solid, outgoing & ~into_solid)): ++ assert np.isfinite(received[inc]).all() and np.isfinite(sent[out]).all() ++ vector[d] = received[inc].sum()-sent[out].sum() ++ magnitude += np.abs(received[inc]).sum()+np.abs(sent[out]).sum() ++ return boundary, transfer, magnitude ++ ++ ++def coarse_flux(before, fine, active): ++ """Derive every replacement from physical midpoints, not production tables.""" ++ x0, y0, x1, y1 = BOUNDS ++ incoming = np.stack([np.roll(before[d], (CY[d], CX[d]), (0, 1)) for d in range(9)]).astype(float) ++ magnitude = 0.0 ++ for y, x in np.argwhere(active): ++ for d in range(1, 9): ++ if x0 <= x+.5-CX[d]/2 <= x1 and y0 <= y+.5-CY[d]/2 <= y1: ++ a, b = 4+2*(x-x0), 4+2*(y-y0) ++ children = fine[d, b:b+2, a:a+2].astype(float) ++ assert children.shape == (2, 2) and np.isfinite(children).all() ++ incoming[d, y, x] = children.sum()/4 ++ magnitude += np.abs(children).sum()/4 ++ assert np.isfinite(incoming[:, active]).all() ++ # This retains the eight grazing-corner replacements of uncovered donors. ++ flux = (incoming[:, active]-before[:, active].astype(float)).sum(axis=1) ++ magnitude += np.abs(incoming[:, active]).sum()+np.abs(before[:, active]).sum(dtype=float) ++ return flux, magnitude ++ ++ ++def run_patch(speed, *, audit=True): ++ cfg = LBMConfig(nx=24, ny=24, viscosity=.05, velocity=0, rho=1) ++ coarse_active = np.ones((24, 24), bool) ++ coarse_active[4:20, 4:20] = False ++ source = object_spec(speed) ++ state = vars(source.state).copy() ++ with CudaContext(0) as context: ++ build = (patch.object(compiler, "compile_kernel", audit_compiler(compiler.compile_kernel)) ++ if audit else nullcontext()) ++ with build: ++ backend = implementation.FixedPatchStepper(cfg, BOUNDS, context=context, fine_objects=[source]) ++ with backend, context.activate(): ++ c, f = backend._levels ++ cl = backend._fine_curved ++ geometry = {name: getattr(cl, name).copy() for name in GEOMETRY} ++ flags = backend.fine_boundary.flags.reshape(40, 40) ++ solid = (flags & SOLID) != 0 ++ active = np.zeros((40, 40), bool) ++ active[4:-4, 4:-4] = True ++ active &= (flags & FLUID) != 0 ++ active &= ~solid ++ local = backend.fine_boundary.objects[0] ++ assert local.center == (20., 20.) and local.radius == 4.3 ++ assert source.center == (12.25, 12.25) and source.radius == 2.15 ++ yy, xx = np.mgrid[:40, :40] ++ roi = active & ((xx-20)**2+(yy-20)**2 <= 9**2) ++ backend.initialize(rest((24, 24)), rest((40, 40))) ++ if audit: ++ for level in backend._levels: ++ for name in ("collision_counts", "explosion_counts", "incoming_counts"): ++ pointer, size = level.module.get_global(name) ++ cuda.memset_d8(pointer, 0, size) ++ initial = backend.download() ++ initial_pop = initial[0][:, coarse_active].sum(axis=1, dtype=float) ++ initial_pop += .25*initial[1][:, active].sum(axis=1, dtype=float) ++ boundary, fine_transfer, coarse_transfer = np.zeros(9), np.zeros(9), np.zeros(9) ++ budget_sum, reflection_error, drive_mass = 0., 0., 0. ++ traces = [] ++ original_curved, original_fine, original_coarse = backend._curved, f.kernel, c.kernel ++ ++ def curved(*args, **kwargs): ++ nonlocal boundary, fine_transfer, budget_sum, reflection_error, drive_mass ++ backend._stream.synchronize() ++ before = read(args[0], f.shape) ++ expected = reflection_oracle(before, cl, speed) ++ original_curved(*args, **kwargs) ++ backend._stream.synchronize() ++ staged = read(args[0], f.shape) ++ d, k = cl.dir.astype(int), cl.fluid_idx.astype(int) ++ values = staged.reshape(9, -1)[OPP[d], k+CX[d]+40*CY[d]] ++ passive = reflection_oracle(before, cl, None, verify_projection=False) ++ drive_mass += .25*float(np.sum(values-passive)) ++ error = float(np.max(np.abs(values-expected))) ++ reflection_error = max(reflection_error, error) ++ assert error <= 1e-7 ++ np.testing.assert_array_equal(staged[:, active], before[:, active]) ++ b, transfer, magnitude = fine_flux(before, staged, active, solid) ++ boundary += .25*b ++ fine_transfer += .25*transfer ++ budget_sum += .25*magnitude ++ ++ def fine(*args, **kwargs): ++ nonlocal budget_sum ++ backend._stream.synchronize() ++ staged = read(args[0], f.shape) ++ original_fine(*args, **kwargs) ++ backend._stream.synchronize() ++ advanced = read(args[1], f.shape) ++ assert np.isfinite(advanced[:, active]).all() ++ assert np.isnan(advanced[:, solid]).all() ++ # Include actual collision operands in the FP32 rounding budget. ++ budget_sum += .25*np.abs(staged[:, active]).sum(dtype=float) ++ traces.append(advanced[:, roi].copy()) ++ ++ def coarse(*args, **kwargs): ++ nonlocal coarse_transfer, budget_sum ++ backend._stream.synchronize() ++ before, fine_values = read(args[0], c.shape), read(args[2], f.shape) ++ transfer, magnitude = coarse_flux(before, fine_values, coarse_active) ++ coarse_transfer += transfer ++ budget_sum += magnitude ++ return original_coarse(*args, **kwargs) ++ ++ with patch.object(backend, "_curved", curved), patch.object(f, "kernel", fine), \ ++ patch.object(c, "kernel", coarse): ++ backend.step(2) ++ actual = backend.download() ++ population = actual[0][:, coarse_active].sum(axis=1, dtype=float) ++ population += .25*actual[1][:, active].sum(axis=1, dtype=float) ++ ledger = boundary+fine_transfer+coarse_transfer ++ error = MOMENTS@(population-initial_pop-ledger) ++ budget = 8*np.finfo(np.float32).eps*budget_sum ++ assert np.isfinite(budget_sum) and budget_sum > 0 ++ assert np.max(np.abs(error)) <= budget ++ if speed: ++ assert speed*drive_mass > 0 ++ assert len(traces) == 4 and backend.step_count == 2 ++ if audit: ++ for level, mask, count in ((c, coarse_active, 2), (f, active, 4)): ++ pointer, size = level.module.get_global("collision_counts") ++ counts = read(pointer, mask.shape, np.uint32) ++ assert size == counts.nbytes ++ np.testing.assert_array_equal(counts, count*mask) ++ for name, values in geometry.items(): ++ np.testing.assert_array_equal(getattr(cl, name), values) ++ assert vars(source.state) == state and source.geometry.center == source.center ++ print(f"speed={speed} audit={audit} BFL={reflection_error:.9g} ledger={error.tolist()} " ++ f"budget={budget:.9g} boundary={list(MOMENTS@boundary)} " ++ f"transfer={list(MOMENTS@(fine_transfer+coarse_transfer))} " ++ f"drive_mass={drive_mass:+.9g}; counts={'PASS' if audit else 'normal build'}", flush=True) ++ return traces, roi, actual ++ ++ ++def uniform_reference(speed, roi): ++ # Reuse the existing explicit config helper without importing unrelated tests. ++ spec = importlib.util.spec_from_file_location("fine_surface_cases", ROOT/"tests/integration/_cases.py") ++ cases = importlib.util.module_from_spec(spec) ++ spec.loader.exec_module(cases) ++ with cases.make_sim(nx=48, ny=48, viscosity=.1, velocity=0, rho=1) as sim: ++ sim.add_body("circle", center=(24, 24), radius=4.3, surface_actuation=surface(speed)) ++ sim.initialize() ++ # Uniform 48^2 has the same dx=dt=.5 representation. Its distant channel ++ # boundaries cannot influence the circle ROI within these four hops. ++ traces = [] ++ for _ in range(4): ++ sim.run(1) ++ traces.append(sim.get_ddf().reshape(9, 48, 48)[:, 4:44, 4:44][:, roi].copy()) ++ return traces ++ ++ ++@pytest.mark.parametrize("speed", [0., .002, -.002]) ++def test_fine_surface_four_hops(speed): ++ assert Path(CelerisLab.__file__).resolve() == ROOT/"src/CelerisLab/__init__.py" ++ assert Path(compiler._KERNEL_DIR).resolve() == ROOT/"src/CelerisLab/lbm/kernels" ++ assert Path(implementation.__file__).resolve() == ROOT/"src/CelerisLab/lbm/refinement_stepper.py" ++ actual, roi, final = run_patch(speed) ++ reference = uniform_reference(speed, roi) ++ for got, wanted in zip(actual, reference): ++ np.testing.assert_allclose(got, wanted, atol=3e-6, rtol=0) ++ np.testing.assert_allclose(MOMENTS@got.astype(float), MOMENTS@wanted.astype(float), ++ atol=2e-5, rtol=0) ++ if speed == 0: ++ passive, passive_roi, passive_final = run_patch(None, audit=False) ++ np.testing.assert_array_equal(passive_roi, roi) ++ for got, wanted in zip(actual+list(final), passive+list(passive_final)): ++ np.testing.assert_array_equal(got, wanted) ++ ++ ++@pytest.mark.parametrize("missing", ["surface_velocity_gpu", "link_exchange_gpu"]) ++def test_missing_surface_device_buffer_rejects_before_launch(missing): ++ backend = implementation.FixedPatchStepper.__new__(implementation.FixedPatchStepper) ++ backend.fine_boundary = SimpleNamespace(objects=[object_spec(.002)]) ++ backend._fine_curved = SimpleNamespace(fluid_idx_gpu=object(), ++ surface_velocity_gpu=object(), link_exchange_gpu=object()) ++ setattr(backend._fine_curved, missing, None) ++ backend._curved = Mock() ++ with pytest.raises(RuntimeError, match="Surface boundary device buffers are missing"): ++ backend._apply_fine_boundary(object()) ++ backend._curved.assert_not_called() ++ ++ ++def test_close_frees_fine_boundary_after_stream_failure_once(): ++ backend = implementation.FixedPatchStepper.__new__(implementation.FixedPatchStepper) ++ backend.ctx = SimpleNamespace(activate=nullcontext) ++ backend._lock = RLock() ++ backend._status = "ready" ++ stream, soa, first, second = Mock(), Mock(), Mock(), Mock() ++ stream.synchronize.side_effect = RuntimeError("stream synchronization failed") ++ backend._stream = stream ++ backend._fine_curved = soa ++ backend._fine_flags = first ++ backend._curved = Mock() ++ backend._levels = [object(), object()] ++ backend._allocations = [first, second] ++ with pytest.raises(RuntimeError, match="stream synchronization failed"): ++ backend.close() ++ assert backend._status == "closed" ++ assert backend._levels == [] and backend._allocations == [] ++ assert backend._fine_curved is None and backend._fine_flags is None ++ assert backend._curved is None and backend._stream is None ++ backend.close() ++ stream.synchronize.assert_called_once_with() ++ soa.free.assert_called_once_with() ++ first.free.assert_called_once_with() ++ second.free.assert_called_once_with() ++ ++ ++def test_cross_interface_donor_rejects_before_cuda(): ++ cfg = LBMConfig(nx=24, ny=24, viscosity=.05) ++ source = SimObject(0, CircleGeometry(5.05, 12.25, .7), ++ center=(5.05, 12.25), radius=.7, surface_actuation=surface(.002)) ++ context = Mock() ++ context.activate.side_effect = AssertionError("must reject before CUDA activation") ++ with patch.object(cuda, "mem_alloc") as allocate: ++ with pytest.raises(ValueError, match="donor crosses"): ++ implementation.FixedPatchStepper(cfg, BOUNDS, context=context, fine_objects=[source]) ++ context.activate.assert_not_called() ++ allocate.assert_not_called() diff --git a/research/fine_surface_20261014/manifest.json b/research/fine_surface_20261014/manifest.json new file mode 100644 index 0000000..8281338 --- /dev/null +++ b/research/fine_surface_20261014/manifest.json @@ -0,0 +1,102 @@ +{ + "head": "6e3756c587ec08ab6a55c4a1a5f4671822d3f0a0", + "changes": [ + { + "path": "src/CelerisLab/lbm/kernels/refinement.cu", + "added": 10, + "removed": 2, + "sha256": "129f3d91da93b4324f88a0da73a4da1e5390f72c14cce574ee63306712da9895", + "characters": 4482 + }, + { + "path": "src/CelerisLab/lbm/kernels/step/aux_kernels.cu", + "added": 1, + "removed": 55, + "sha256": "578a5b20a157241ee678547059abb1372dd5a589ad06bb2c15b987eb01ca1013", + "characters": 10982 + }, + { + "path": "src/CelerisLab/lbm/kernels/step/curved_double.cu", + "added": 61, + "removed": 0, + "sha256": "bfa7a1df1e939020314d49755045f7a85fe4a19cc1c68dbe62653c66c5e7c2b3", + "characters": 2153 + }, + { + "path": "src/CelerisLab/lbm/refinement.py", + "added": 157, + "removed": 3, + "sha256": "8935b070ec9e7020897919c15f43f7fa6293f02e2ff64a19a3e3d99bc444dbcc", + "characters": 14161 + }, + { + "path": "src/CelerisLab/lbm/refinement_stepper.py", + "added": 66, + "removed": 10, + "sha256": "9178224089ee6584420b79f10cf1d91441645b668e8b6898641d19eac757687b", + "characters": 14875 + }, + { + "path": "src/CelerisLab/lbm/stepper.py", + "added": 5, + "removed": 1, + "sha256": "0dcb7cd7ae87e33e3dc67a38b6aa43042fbe673e37d9ad165342ee1d695933ce", + "characters": 7724 + }, + { + "path": "tests/unit/test_fine_surface.py", + "added": 215, + "removed": 0, + "sha256": "b232b55e75eef52480f06a35c401d72b6145892bb8b79d1d1b3cfed965b3506c", + "characters": 10596 + }, + { + "path": "tests/validation/multigrid/test_fine_surface_gpu.py", + "added": 330, + "removed": 0, + "sha256": "d45ca48fc4e77d021fcc5461329b094ae11b257c036bb23634d326fbbedb7700", + "characters": 16204 + } + ], + "unchanged_baseline_files": 377, + "baseline_file_count": 382, + "post_status": " M pyproject.toml\n M setup.py\n M src/CelerisLab/__init__.py\n M src/CelerisLab/body/__init__.py\n M src/CelerisLab/body/ddf_patch.py\n M src/CelerisLab/body/manager.py\n M src/CelerisLab/body/objects.py\n M src/CelerisLab/body/preprocess/flag_overlay.py\n M src/CelerisLab/common/__init__.py\n M src/CelerisLab/common/checkpoint.py\n M src/CelerisLab/config.py\n M src/CelerisLab/configs/CONFIG.md\n M src/CelerisLab/cuda/__init__.py\n M src/CelerisLab/cuda/compiler_v2.py\n M src/CelerisLab/cuda/context.py\n M src/CelerisLab/lbm/__init__.py\n M src/CelerisLab/lbm/curved_links.py\n M src/CelerisLab/lbm/field.py\n M src/CelerisLab/lbm/initializers.py\n M src/CelerisLab/lbm/kernels/boundary/bounce_back.cuh\n M src/CelerisLab/lbm/kernels/boundary/curved_boundary.cuh\n M src/CelerisLab/lbm/kernels/boundary/inlet/common.cuh\n M src/CelerisLab/lbm/kernels/boundary/inlet/zou_he_local.cuh\n M src/CelerisLab/lbm/kernels/boundary/inlet_outlet.cuh\n M src/CelerisLab/lbm/kernels/config/config_grid.h\n M src/CelerisLab/lbm/kernels/config/config_method.h\n M src/CelerisLab/lbm/kernels/config/config_objects.h\n M src/CelerisLab/lbm/kernels/config/config_physics.h\n M src/CelerisLab/lbm/kernels/kernel_v2.cu\n M src/CelerisLab/lbm/kernels/operators/collision_mrt.cuh\n M src/CelerisLab/lbm/kernels/operators/collision_trt.cuh\n M src/CelerisLab/lbm/kernels/operators/forcing_guo.cuh\n M src/CelerisLab/lbm/kernels/step/aux_kernels.cu\n M src/CelerisLab/lbm/kernels/step/esopull_sync.cu\n M src/CelerisLab/lbm/kernels/step/init_flow.cu\n M src/CelerisLab/lbm/kernels/step/one_step_double.cu\n M src/CelerisLab/lbm/kernels/step/one_step_esopull.cu\n M src/CelerisLab/lbm/kernels/streaming/esopull_semantic_helpers.cuh\n M src/CelerisLab/lbm/stepper.py\n M src/CelerisLab/simulation.py\n M tests/integration/test_body_sync_e2e.py\n M tests/integration/test_ddf_patch.py\n M tests/integration/test_sync_bodies_skeleton.py\n M tests/integration/test_unified_obs.py\n M tests/postproc/experiment.ipynb\n M tests/validation/run_kan99b_rotating_cylinder.py\n M tests/validation/run_sah04_st_matrix.py\n M tests/validation/test_sensor_accuracy.py\n?? docs/design/\n?? docs/multilevel_grid_architecture_analysis.md\n?? examples/\n?? research/\n?? src/CelerisLab/lbm/kernels/boundary/planar_velocity.cuh\n?? src/CelerisLab/lbm/kernels/refinement.cu\n?? src/CelerisLab/lbm/kernels/step/curved_double.cu\n?? src/CelerisLab/lbm/refinement.py\n?? src/CelerisLab/lbm/refinement_stepper.py\n?? \"tests/audit/body\\345\\210\\240\\345\\207\\217\\345\\212\\237\\350\\203\\275.md\"\n?? tests/integration/_cases.py\n?? tests/integration/test_numerical_gpu.py\n?? tests/integration/test_runtime_contracts_gpu.py\n?? tests/integration/test_state_gpu.py\n?? tests/integration/test_surface_actuation_gpu.py\n?? tests/unit/cpp/\n?? tests/unit/test_build_contracts.py\n?? tests/unit/test_context_ownership.py\n?? tests/unit/test_fine_surface.py\n?? tests/unit/test_initializers.py\n?? tests/unit/test_numerical_operators.py\n?? tests/unit/test_planar_velocity.py\n?? tests/unit/test_refinement.py\n?? tests/unit/test_reservoir.py\n?? tests/unit/test_simulation_lifecycle.py\n?? tests/unit/test_slot_velocity.py\n?? tests/unit/test_state_regressions.py\n?? tests/unit/test_surface_actuation.py\n?? tests/validation/analyze_j3_saved_frames.py\n?? tests/validation/diagnose_j3_lags.py\n?? tests/validation/multigrid/\n?? tests/validation/run_j1.py\n?? tests/validation/run_j2_slot.py\n?? tests/validation/run_j3_coverage.py\n?? tests/validation/run_j3_reservoir.py\n?? tests/validation/run_poiseuille.py\n", + "patch_sha256": "9cf8b5cc4ea037c865762ba7069f0c1daabcb4383d4333167d279f8b7704e5b0", + "cleanup": { + "baseline_copy_dir": "/tmp/celeris-fine-surface-baseline-z98oi6ps", + "baseline_copy_bytes": 1581541, + "runner": "/tmp/celeris-fine-surface-gpu-run.py", + "baseline_copies_removed": true, + "runner_removed": true, + "gpu_scratch_removed": true + }, + "shared_kernel_exact_extraction": true, + "diff_reverse_check": "passed", + "evidence_hashes": { + "cpu_surface_projection_command.txt": "b1783e26e92737106a5614fff01452c8ea0364372d9bdbc44c7d15c19d9b13f5", + "cpu_surface_projection_exit.txt": "9a271f2a916b0b6ee6cecb2426f0b3206ef074578be55d9bc94f6f3fe3ab86aa", + "report.txt": "ad8af2be7239f8fe728ac7a8db340d4458e6ec1bbb30b14e614c1072dd9804ec", + "cpu_existing_runs.json": "523b3179b976c2198112c7b49c6c8a75cf7d3332663a8b8a0646c94a39abd1b4", + "gpu_run.json": "8c4b4d7c53e17c30ce4c7d2fb92466e0704f39966e89016dbf82d36cf96e35bf", + "gpu_stdout.txt": "02d1f6fea194d1185a49b7bcdde58642f1d6b9634fe55e4bcda2f020414eb35d", + "cpu_device_guard_cmd.txt": "43a0fb0e20c4adcf1930f145796378294558060d5fd5303402e0538674b68c0a", + "cpu_surface_command.txt": "2b8f2a3c9ddfd1e877efa2a50a935eeb937e2b3ea92515610cd334d80703d6ce", + "baseline.json": "dc9dfa88e69d2b7cf93b0c572961c0bc7849ea1608a0b14b1a6dca1429abf87c", + "cpu_lifecycle_stdout.txt": "af52542989b4a2bf597e020c12064e7083e136f15b938ed5382b616a16f70e38", + "cpu_surface_projection_stdout.txt": "96ea3e4ca948962b6eb92aaf215efb6c598a3c4b296f6fd26094df353ded5722", + "cpu_lifecycle_run.json": "2a3b09ad2f9c86e43892d643a510c9e936d6153e2ae1f6a9eab90c3067f0473d", + "cpu_shared_kernel_stdout.txt": "1ab9905d8b0f34f6d791ff7da4efa2de0f7f3e282a078758cc0496cc0230c0f0", + "cpu_device_guard_stdout.txt": "f4c61c0ac8f55c6c9a2d6c593731bf5f8c4a6c5bebbe514284fd4f899818f9e0", + "gpu_test_run1.py": "3dd0658f63a4e7a1c41eecf433842c872f8fecb391ea4b44d0b48947643d5189", + "gpu_preparation_run1.py": "b3fe9e58118369adb1bdfc618fbfbd917d508a563beaf2555f656b59aeff4425", + "cpu_surface_exit.txt": "9a271f2a916b0b6ee6cecb2426f0b3206ef074578be55d9bc94f6f3fe3ab86aa", + "cpu_surface_stdout.txt": "bdb786f2d289eaeab4e53d0fdccb998525c217efaa778496cf7a97ccca9e1597", + "cpu_preallocation_run.json": "363106050ba00d9a1c5c948c36926e8510ed7fdd75d28cfeca59f593fd0f1c50", + "cpu_final_stdout.txt": "bdb786f2d289eaeab4e53d0fdccb998525c217efaa778496cf7a97ccca9e1597", + "cpu_maps_stdout.txt": "7886fd4e2fa8a63e9cecf02bdf650e5447ba149704ac75f51da6964d8e77ba6b", + "cpu_device_guard_exit.txt": "9a271f2a916b0b6ee6cecb2426f0b3206ef074578be55d9bc94f6f3fe3ab86aa", + "cpu_preallocation_stdout.txt": "59907462a8d5fd93406cdf4c7d1eb2f7b7a96664ae85c4ec202693d419cd019e", + "incremental.diff": "9cf8b5cc4ea037c865762ba7069f0c1daabcb4383d4333167d279f8b7704e5b0", + "cpu_final_run.json": "020a9ef12904c2d18185613d68a58dd7ff9b1b22197ac1f95bba61f2f593eaac" + } +} diff --git a/research/fine_surface_20261014/report.txt b/research/fine_surface_20261014/report.txt new file mode 100644 index 0000000..6b9e512 --- /dev/null +++ b/research/fine_surface_20261014/report.txt @@ -0,0 +1,115 @@ +2026-10-14 — 固定加密区内静止圆表面吹吸:受限整合交付 + +状态:当前代码与验证完成,停在独立审查点。A 的单层静止圆功能保持;本次只 +把完整边界 stencil 位于 fine active 的圆接入 FixedPatchStepper。未增加 +checkpoint、forcing、运动刚体、喷嘴内部、墙穿接口、blockforest 或临时 ledger。 +所有 B 反例与既有证据保留。 + +入口与单位 +FixedPatchStepper(cfg, bounds, context=context, fine_objects=[obj])。 +obj 是现有 SimObject/CircleGeometry;中心/半径用 coarse 物理坐标,速度沿用 +coarse lattice 单位(当前 dx=dt=1)。构造独立 fine-local 副本,不修改调用方对象。 +C_local=(C_phys-origin)/dx-.5,R_local=R_phys/dx,U_local=U_phys*dt/dx。 +真实 hit 反变换为 origin+dx*(hit_local+.5),lever arm 乘 dx,角度/q 不变。 +维持 D2Q9/SRT/FP32/unshifted/double_buffer、无 LES/forcing 的原 backend 范围。 + +生产改动:5 个现有文件 + 1 个共享文件,+300/−71,净 +229 行。 +- refinement.py:FineBoundary2D、prepare_fine_boundary;纯 CPU 建图和拒绝检查。 +- refinement_stepper.py:固定 fine 对象、flags/SoA 管理、两个 BFL 子步、solid + 叶掩码、初始化与释放;不接完整 Simulation/ObjectManager。 +- aux_kernels.cu → step/curved_double.cu:原 action_omega/CurvedBoundaryKernel + 代码块逐字相同,只抽取共享位置并增加 include guard,已比对确认。 +- refinement.cu:包含共享 BFL,PatchFineStep 接 flags;solid 不 pull/collide, + 输出 NaN;所有 Python launch 传完整参数。 +- 原 lbm/stepper.py:allocation 显式 is not None;驱动缓冲缺失报错。 + +数据/所有权 +explosion → BFL(current) → fine pull+collision → BFL(spare) → fine pull+collision +→ coarse pull/coalescence+collision。active fluid 每 coarse 步碰撞两次;solid +与 ghost 不碰撞。BFL 只填当前输入的 solid source 反射槽,下一子步重新填充。 +下载仅发布流体叶节点,coarse covered、fine solid/ghost 均 NaN。 +flags/level/transfer arrays 归 stepper._allocations;SoA 的列及速度/交换缓冲只 +归 SoA,未重复登记。initialize 清空最新交换缓存。无对象不创建这些新缓冲。 +内部交换缓冲仅代表最后一个 fine 子步,未新增公共 coarse 累计诊断。 +测试账本分别读取四个 fine 子步的实际 population,按面积 1/4 求和;不是用 +latest 值冒称区间总量,也不是喷嘴总推力。 + +有限依赖规则 +plan.transfer_reads 保存 (hop, direction, cell),从实际 coalesce_fine 的 hop 2 +源槽反向两次 pull;遇 active collision 展开全部 9 个输入,hop 0 停止。 +transfer_fine_cells 加入全部 ghost_fine/explosion 写集;coarse 集合包含实际 +ghost_coarse donors 与 coalesce_coarse targets。ghost 可以合法参与运输; +outer ghost 的各阶段有效性仍按原 kernel 判断。 +逐条检查 r active fluid、s=r+c active solid、反射写槽唯一、q<.5 的 r−c +仍在 active;不可用 fallback 掩盖跨层 donor。同层真实 solid 阻挡的原 fallback +语义不改。逆查所有 active-fluid→solid 邻接,确保与 cut links 完全一致。 +整个 solid 集合及 r/s/donor stencil 均不得碰到上述 transfer footprint。 +coarse donors/targets 必须 uncovered bulk;slot 模式另外拒绝其真实壁面 +reconstruction pull stencil。无对象旧 slot 模式保持原规则。 + +CPU 结果(原始 command/stdout/exit 见同目录) +- 新建图/单位/边界覆盖/拒绝检查:15 passed,最终代码复测 15 passed,exit 0。 + 同行补充的非对角圆心、origin=(2,2)、四子格平均等于 coarse I+.5 也通过。 +- 旧 maps:9 passed、23 subtests;共享 actual CUDA-header CPU 回归:1 passed。 +- 旧生命周期/边界模式:5 passed、5 subtests。 +- 新缺失驱动缓冲拒绝:2 passed,exit 0;同步失败后释放且不重复释放:通过。 +- 指定 donor 反例通过构造器检查,context.activate/mem_alloc 均未调用:1 passed。 + +真实 GPU 结果与首次批次失败说明 +使用现有 pycuda_3_10、显式 PYTHONPATH=/home/frank14f/CelerisLab/src;stdout +首先打印并断言实际包来源。设备 0 UUID GPU-e8853ae7-a302-6a17-bcfa-aa767e9ed20c, +开始时占用 5 MiB、util=0、无计算进程;未用其他设备。 +运行批次真实 exit=1:5 项 GPU 检查和 1 项 CPU cleanup 检查通过,另 2 项 CPU +缺失缓冲夹具失败,因为夹具未提供新增前置检查所需的 fluid_idx_gpu 字段。 +仅补齐夹具后,定向 CPU 重测这 2 项 exit=0;原日志/exit=1 保留,未重跑 GPU。 + +5 项 GPU 检查: +1–3. speed=0,+.002,−.002 的批准小案例,各 2 coarse/4 fine 步。 + coarse24²,patch[4,20)²,fine40²,origin(2,2),dx=dt=.5;物理圆心 + (12.25,12.25)、R2.15 → local(20,20)、R4.3;angle.7/half_width.85; + nu_phys=.05,tau_c=.65/tau_f=.8,rho1/u0/G=feq。 + 三个驱动使用私有 audit build 验证 fine fluid 碰撞4次、coarse fluid2次, + solid/ghost0次。零驱动另与正常 production build 的 same-solid/no-actuation + 路径逐元素相等。参考采用正常 A build 的48²、dx=dt=.5、circle local(24,24), + 对齐真实物理位置与时间(4 fine步=物理时间2),不是跨分辨率逐元素比较。 +4. 旧无对象 periodic 非居中矩形 normal build:1 coarse步,最大人口误差 + 1.14050047e−7,通过。 +5. 旧无对象 slot/reservoir normal build:8 coarse步,最大人口误差 + 1.78241457e−7、最大BC误差2.21654773e−7,通过。 + +主要数值: + speed max |BFL误差| max |累计质量/动量账本残差| 预定FP32预算 + 0 7.4505806e−9 1.6049482e−5 0.00221051117 + +.002 9.7307344e−9 1.5977304e−5 0.00221052543 + −.002 7.4505806e−9 1.6636681e−5 0.00221049693 +BFL阈值1e−7;同细分辨率、未触接口的圆周ROI人口atol3e−6、局部矩2e−5均通过。 +账本预算为8*eps32*实际参与加权population绝对值总和,未放宽。喷吸附加质量 +分别约+0.00620033871/−0.00618575338,符号正确。该短例净transfer项为0; +仍逐项统计真实非零出入人口,但喷吸扰动尚未触达接口。 + +拒绝证据 +- physical C=(5.05,12.25),R=.7 → fine C=(5.6,20),R=1.4:r=(4,20),c=(1,0), + hit=(4.2,20),q≈.2,donor=(3,20)为ghost,构造在任何CUDA调用前拒绝。 +- physical C=(6.05,12.25),R=.7:全部直接r/s/donor都active,仍因与真实 + 两hop transfer footprint相交而拒绝。说明通过边界检查不能仅靠包围盒或边距。 + +资源与记录 +GPU批次外部耗时25.395s;进程组RSS峰值386883584 bytes,RAM最小空闲 +63638339584 bytes,VRAM最小空闲15826 MiB,相关临时空间采样峰值3585985 bytes。 +按实际余量保护,无固定RSS/AS上限;120s与2GB本次临时量约束未触发。监测是 +采样方式,不是OS硬资源隔离。编译临时目录已清理;不会清理其他任务或旧证据。 +baseline.json保存382个src/tests/examples文件哈希;其中377个保持不变。 +manifest.json和incremental.diff只描述本轮;共享kernel抽取相等与反向patch检查通过。 +GPU执行后仅将建图时的孔口预检输入改成与实际八列完全一致的FP32 lever arm, +避免极窄孔口在分配前后得到不同覆盖判断;最终CPU15项复测通过。GPU算子、上传 +数组生成方式、步序和测试数值部分未变。gpu_test_run1.py/gpu_preparation_run1.py +是按GPU运行中已记录的SHA256逐项核对后的执行版快照,保留首次运行的精确来源。 + +参考与边界 +直接复用A已接受BFL。ref/OpenLB/src/boundary/defineU2D.hh:74–79用于真实hit +速度投影对照,offBoundaryPostProcessors2D.hh:115–127用于两分支stencil对照; +OpenLB commit fb62326f260bf0c5ec2666fc5e055c0813ff50a9,仅算法对照、未复制代码。 +现有CPUREF-0.3与实际refinement kernel的ghost不碰撞、两hop/每层tau、incoming +替换后coarse碰撞保持不变,未移植任何B候选。 +不声称喷流穿粗细接口精度、长时稳定性、空间收敛或性能已验证。设备free()自身 +抛错时沿用既有close限制,不保证完整释放或重试;上下文激活失败可保留资源重试。 diff --git a/research/fine_surface_joint_20261014/baseline_00.json b/research/fine_surface_joint_20261014/baseline_00.json new file mode 100644 index 0000000..4ae101e --- /dev/null +++ b/research/fine_surface_joint_20261014/baseline_00.json @@ -0,0 +1,182 @@ +{ + "src/CelerisLab.egg-info/PKG-INFO": "0b9a8a4e8d60bc531473688723ddef0aab02c7ccc4997e31c9b6a6c35011ca77", + "src/CelerisLab.egg-info/top_level.txt": "cd51958ca03afabbaa9618c60b8280e486f8cc0b0359b839e10f886e7c3948f8", + "src/CelerisLab.egg-info/dependency_links.txt": "01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b", + "src/CelerisLab.egg-info/requires.txt": "36e1404178e5ea590b2fc04e8ba4d748ec9a82e7693136ccf0dfd204fe265c04", + "src/CelerisLab.egg-info/SOURCES.txt": "f36b29c1b34c4bd6b2acc3ccdd21c24ee5077df7e2a20a652d9fae77eedb8e21", + "src/CelerisLab/simulation.py": "c9d903f53fe356d7af281bea07943de1a62494127fb69848d7053fd46f7dec3e", + "src/CelerisLab/config.py": "2f1bba7515f5bc08cb3a8d140bcafe7fa0689e01b3b06494697bb2956a71530e", + "src/CelerisLab/__init__.py": "21cc469bd6e970a1f9ff5970c8eea4602065e41fc881854759ee565ee55c10c6", + "src/CelerisLab/cuda/compiler_v2.py": "c4cc3ec4445c8d75e6a253dd87963877117a722bc73b9d4811806fc6045d08c1", + "src/CelerisLab/cuda/obs_layout.py": "5ffb2c3aeeaaaaeb64f2cd8febfbcf4ad9919e5414020ad753cfade0683b21c2", + "src/CelerisLab/cuda/context.py": "013dd4ec6d01d2fbd11afdfb103eac6a273bd9f798d663d761b851eeb27885e9", + "src/CelerisLab/cuda/__init__.py": "0d01dff9f0399c8baba822aab5ca0122a135f011008ed8a499ebd9f7e5b06aea", + "src/CelerisLab/lbm/refinement_stepper.py": "9178224089ee6584420b79f10cf1d91441645b668e8b6898641d19eac757687b", + "src/CelerisLab/lbm/field.py": "0e727eacc3706add4d8d15c418e9b631050871f831698d3ac689dd5f2c701b9b", + "src/CelerisLab/lbm/equilibrium.py": "2fb2f2bb7ff326d23abce80fc2a4c0907b17740ea3e29fe6ae079c5044783826", + "src/CelerisLab/lbm/descriptors.py": "c9f025dfc14da43b989047b84cc22bd05d5cc92c9ec695c1da68fdfb788e3f2b", + "src/CelerisLab/lbm/initializers.py": "dacf9586963e862d6d0a98ef1a066036be6f91e9d423720661d8ef2c1fb2df6a", + "src/CelerisLab/lbm/curved_links.py": "00d9c29d660b41190f32dd737b12f60e10ce4214b6c9a6ab2a63438813faa594", + "src/CelerisLab/lbm/stepper.py": "0dcb7cd7ae87e33e3dc67a38b6aa43042fbe673e37d9ad165342ee1d695933ce", + "src/CelerisLab/lbm/__init__.py": "7f60fb3aaae81501b510d08c2fedff44fcb05657260eb10b6f5cc91e7204306b", + "src/CelerisLab/lbm/refinement.py": "8935b070ec9e7020897919c15f43f7fa6293f02e2ff64a19a3e3d99bc444dbcc", + "src/CelerisLab/lbm/kernels/kernel_v2.cu": "c7bd3fb705b77261ba2441c52a24a7e6a7865c165cba088a1b75201c4d29c408", + "src/CelerisLab/lbm/kernels/refinement.cu": "129f3d91da93b4324f88a0da73a4da1e5390f72c14cce574ee63306712da9895", + "src/CelerisLab/lbm/kernels/config.h": "7d1124125e0b354558297934460e64c760fb68cdd7bf6d01a1238bb2eaab8c37", + "src/CelerisLab/lbm/kernels/kernel_v2.ptx": "a599ee30ae66800f4d4220eb79dfed35ff32991661260f01ea58023ef780f0ca", + "src/CelerisLab/lbm/kernels/operators/turbulence_smag.cuh": "ff7f000297ee0817e255ad9fcb6a13b647e3ddd5b206518d35f38d2895a9f501", + "src/CelerisLab/lbm/kernels/operators/collision_mrt.cuh": "aee444eb60c47a3fd518dca975d1af05425a0818a0ec6c3fb3f6150f60c2cb44", + "src/CelerisLab/lbm/kernels/operators/collision_trt.cuh": "9725b9840b9ad8b4ec7be61ff5d06d3151e86d1a87585c13f2fbf934d0d2c5f6", + "src/CelerisLab/lbm/kernels/operators/collision_srt.cuh": "6b7ff842f392c8f853d2d1a97cc69bfe50f21283f73e659404da07cf6c95f5e1", + "src/CelerisLab/lbm/kernels/operators/forcing_guo.cuh": "969a430c1af03f32e3bd0df95d805e64f56334717c44dd4ba208ba503062a24b", + "src/CelerisLab/lbm/kernels/operators/macro.cuh": "e27c1c410dc857be98da4596568e405eeaf88701d291ac0e398aa9cd23dee740", + "src/CelerisLab/lbm/kernels/operators/helpers.cuh": "0b3a4d95d7d19f5fec09e5423b8f4cc99f8a226b541967425967330da5a051ec", + "src/CelerisLab/lbm/kernels/core/precision.cuh": "849df14b4cce50af52399e4b8f3e997196f3ae5f1163f68e28df3e6b2507a8c4", + "src/CelerisLab/lbm/kernels/core/descriptors.cuh": "8440bc14857da9007982650f828a23608eec9f7cc4bf772e8c8dc1239cb45356", + "src/CelerisLab/lbm/kernels/core/obs.cuh": "b742b77c9f61e1f020fe9922c3838ae9d855e17b381154958b58f10a22938922", + "src/CelerisLab/lbm/kernels/core/params.cuh": "6e18bf730d936d940e3d85452f0714a2eaae31bf41002f9fd520ec5b372878dd", + "src/CelerisLab/lbm/kernels/core/flags.cuh": "0025705f24710330d9d9195f713879bfb650a85a3449baef0e196b831af104ab", + "src/CelerisLab/lbm/kernels/core/layout.cuh": "1fbd820021c89ac3efcde24145996cb0147769e607e498e61f308ed3e0b13706", + "src/CelerisLab/lbm/kernels/boundary/ibm_kernels.cuh": "e6909b547dc8d64cdd8a76a90660243a8f5fee535caa161b52b4dd8b7c29934b", + "src/CelerisLab/lbm/kernels/boundary/planar_velocity.cuh": "0b2f9e0bd483c199637e5672dc0ffc460bc383dd1804805befbeb4c5d8c708d1", + "src/CelerisLab/lbm/kernels/boundary/inlet_outlet.cuh": "de8b213a6da42c2e5e9f8966199fc66ea4541b85144a90f3f5dbad3c6ab63b97", + "src/CelerisLab/lbm/kernels/boundary/curved_boundary.cuh": "7bccf7e7091c012d7a3d4874a881d4d46699021faedd83d125933fbdaa562711", + "src/CelerisLab/lbm/kernels/boundary/bounce_back.cuh": "aba3748c564ed91b161d268ef8b737b7c7be96a823063d201f3da684dd845233", + "src/CelerisLab/lbm/kernels/boundary/esopull_curved_helpers.cuh": "b9b474bc4edaff05681c5443235472d04072d0d775fc0eb9c5967faef52b0258", + "src/CelerisLab/lbm/kernels/boundary/inlet/equilibrium.cuh": "f0964c811b2c41a5aaa1c6d99c490b06e850c634eb8749f1f05ef61f93c2de1d", + "src/CelerisLab/lbm/kernels/boundary/inlet/channel_stabilized.cuh": "efe077afcbb6b731256a987c2fd79a1dbc470c902f87070d60421ea6cb13d4e2", + "src/CelerisLab/lbm/kernels/boundary/inlet/common.cuh": "f3cec54c8873c65b3dca4375605d2c89a8727765884d3954c235242fdff9c6ba", + "src/CelerisLab/lbm/kernels/boundary/inlet/zou_he_local.cuh": "e73e66b853b1e4e0e30d8f4185d832aa414ce670a1813ce2b5459f2887f71f89", + "src/CelerisLab/lbm/kernels/boundary/inlet/regularized.cuh": "943d4a571818bacb89c70bccfaac202691121e3e385803ce6309123a0a03ddaf", + "src/CelerisLab/lbm/kernels/boundary/outlet/pressure_neq.cuh": "c8b2adc66d12fe602076ddc9693c5c208711fcaddb58aa9a31401a269f51c4c4", + "src/CelerisLab/lbm/kernels/streaming/esopull_single_buffer.cuh": "77ed4ab9a0ebc5ff62a91a7c39066ef395391ae36e9040a69fb2bd8b1626dc79", + "src/CelerisLab/lbm/kernels/streaming/pull_double_buffer.cuh": "b65d741ed78b7b62f99531ba0c0ce1936663d8dc9640e7d7d16c707f1baf6549", + "src/CelerisLab/lbm/kernels/streaming/esopull_semantic_helpers.cuh": "dd5a9091628b079efd97e53fd49e52d09dcee88529235db77a5648e02937af6e", + "src/CelerisLab/lbm/kernels/step/curved_double.cu": "bfa7a1df1e939020314d49755045f7a85fe4a19cc1c68dbe62653c66c5e7c2b3", + "src/CelerisLab/lbm/kernels/step/esopull_sync.cu": "c0ff3e72900c3ab89a05dd03684e96d3b740cf1672d565727fc2af165933d087", + "src/CelerisLab/lbm/kernels/step/init_flow.cu": "305be3bb12fc0d039acec1701baabcf0e8a35e683c49c34f2af8ca9867d2b29c", + "src/CelerisLab/lbm/kernels/step/esopull_macro.cu": "c73116020ca217ede1e4de27c8269c31f9d91e33433ac8252a21e9b14187c50f", + "src/CelerisLab/lbm/kernels/step/aux_kernels.cu": "578a5b20a157241ee678547059abb1372dd5a589ad06bb2c15b987eb01ca1013", + "src/CelerisLab/lbm/kernels/step/one_step_esopull.cu": "aa223b2744ae6c9125673df311a96ce588032c1ba58bebb11fd33ecb990f8ed4", + "src/CelerisLab/lbm/kernels/step/one_step_double.cu": "f9f8242b38e8e0cf8425b75e2b0215bc15363c62eaa0fb43c761b8e0931bfdc9", + "src/CelerisLab/lbm/kernels/config/config_physics.h": "26df33c2960ba36f3283e19b55b4ea92e50e4efda705f9ebfbf3f875a4092c59", + "src/CelerisLab/lbm/kernels/config/config_method.h": "3db4e16ef2c6b22349d04e6aa8ab04bdfe0eb784f9f3a98277e15dbed1835d81", + "src/CelerisLab/lbm/kernels/config/config_grid.h": "8be3a7cf74ba30d7fd3074fed79e63dbda7311c4d03b454ea641bf298ffeaa8d", + "src/CelerisLab/lbm/kernels/config/config_objects.h": "dbb93c063586da278c15d95e23f84c12e728f4f5f1bbc3980fe9cedaa6fff90e", + "src/CelerisLab/lbm/kernels/config/config_obs.h": "c11e2249359145b5c4cbaaf0487506fa77c1f4b82c7c169ddc574aa0babcd727", + "src/CelerisLab/common/checkpoint.py": "b2f960aecd5ac27a3a7130b809ffad4709c44d522edef0359ab952654625410b", + "src/CelerisLab/common/_types.py": "aad2ff1a9033d4fd68783ad7123afb47201ddc58785cb6dc0246947037072a5f", + "src/CelerisLab/common/pathline.py": "a1b6efcc0a076d0f1dc8d49a595779426d7d5626b00072a59bac710ff02ad046", + "src/CelerisLab/common/__init__.py": "d4dbde78bc97fccc9eabac9abae8f0f15c112c10ff8e9b45bd9401d4723df1ef", + "src/CelerisLab/common/preprocess.py": "7fc78a08857cf8e98519500b094a1d896af189b6b15658ff9b388ed51bed4515", + "src/CelerisLab/common/render.py": "0e055476257eb2bcd11e733766e52195de02f8fad228f570a3511a7c831bdc29", + "src/CelerisLab/common/streakline/_render.py": "236cd637414ee318c4d66f9aed32110d8dc42a100d65fde06172f7cd0ba62c65", + "src/CelerisLab/common/streakline/_integrate.py": "3fbd4368b2c8d0e7fda40dc65aac5df02b085008b4c68acd83cb7ae45d33a13b", + "src/CelerisLab/common/streakline/_streakline.py": "1a3e08daa706b5f83cdeb337e9a945a36ddf7583c40af1d0bb9d825ac954df37", + "src/CelerisLab/common/streakline/__init__.py": "13ff1cfa416fdd721a08a659e76b5a5a99b8d3201add10a83b7b0bc654bc1eec", + "src/CelerisLab/common/streakline/_config.py": "a9185ef68e9c7b5d5a1dc0b04a28341e2ad91d13c145a7c106636a878cf0a605", + "src/CelerisLab/configs/config_lbm.json": "17e4311f1f250c6ece59177a8b6ff856b69a016c7c10267e774b030a0a390865", + "src/CelerisLab/configs/CONFIG.md": "41cafdbe525366c08aa9d0416ea026ccf0026ba7123b8a9b65f968a80d928e3a", + "src/CelerisLab/configs/config_lbm_three_cylinder_triangle.json": "eeb8e7149dbe4aa6b3a9562802735aa950750dfbe2d972a0727e788573afa817", + "src/CelerisLab/configs/config_lbm_flume_trt_regularized.json": "f4bba8e6a4339fc3c4eb14f6e2f57c4b22993c73703c773d853edfbe34736e56", + "src/CelerisLab/configs/config_body.json": "055f261f0828ca1d4f2bb694bd15b72bbcabe31d552326208f28e37f761adab1", + "src/CelerisLab/configs/config_lbm_flume_mrt_zouhe.json": "8f593321db05a563a42931603a228d61cbcba06dfbe113262d5cd0ad93c0fe79", + "src/CelerisLab/body/objects.py": "d1cf7054cc8379a83c39acc66a7c88ae62fa004f110bb0c1def2ee57137401c5", + "src/CelerisLab/body/action_smoother.py": "b1a23ee6bbd4850b172cb8738c5c3546ee465a54189e6af9d8044f023d4687dc", + "src/CelerisLab/body/registry.py": "fbb7327780adbdc6da15ebdb799980daf32df22ee974af0893d7409f177bbb68", + "src/CelerisLab/body/manager.py": "6a40be708c71ef6f3b5f5f0aa9c92cfafc51f2ec2a958f99656cccb850986c16", + "src/CelerisLab/body/ddf_patch.py": "60fcfb7441e73bf290bcff41ca3a83da3e7ddad765d7247464e8f02e3043b4e2", + "src/CelerisLab/body/sync_plan.py": "a73ac9ee361b2120d0b7bbebeaa2ccbf924ba27bd95d4dd4b383c10a39b2a409", + "src/CelerisLab/body/__init__.py": "91d1155080b3ade83d13c84c39693046df122e4bed5ef583de2df1f9453c1b76", + "src/CelerisLab/body/preprocess/flag_overlay.py": "831fc9e9736b758847759a085ff133eb49ec91318ace4fda76f85960138ee300", + "src/CelerisLab/body/preprocess/__init__.py": "dfd9d58bc07f626ab23a70053e31b88a6d9165d2e4c76a4e9f48abe674d3d2ec", + "src/CelerisLab/body/geometry/base.py": "cceca14361ca2f34d34a3e43730e1a79b8ca81be00f0dd62e884db32b479419f", + "src/CelerisLab/body/geometry/__init__.py": "ada88980ab672959aca9aa3a4c4aade3219524b2ab68110cd2a2f41e3e0ca90a", + "src/CelerisLab/body/geometry/circle.py": "7605ca7c21103f1d801ac73ab8dd18dffbdac425b2dee7b8858b283628a9e436", + "src/CelerisLab/body/coupling/soa_packer.py": "8ec26fd55ef74801bbd5ab6bd3d0a7dabc750cbd498aaac2ca4c61a0108ad3c9", + "src/CelerisLab/body/coupling/__init__.py": "c931f7eb318d48408c3e2febcc6917c88c8dcc1697cbf4329b1f340d94c35763", + "tests/conftest.py": "fa0ec26667872c9c1011d608310d2551fd24719b5d216f06d923ff4c74c73237", + "tests/specs/exp_ctrl_matrix.md": "5d9dd2e703582572eb68afe3a7096ea43ec82aa03418d20ed283c5365031e433", + "tests/specs/Sah04_validation.md": "1d122d29e281b7f50801b148f3314a0e35fdc27ee7d757c0a661243aa6185fb0", + "tests/specs/sah04.md": "33dbe5e0fd63738abd055c4aa403c191b6de04e6efdbc568f1942c6d23c7459f", + "tests/specs/Kan99b_validation.md": "0d8bf74f2361f863809af1979bf8807adaa423f98321e1104a3d86d8c7a863cf", + "tests/specs/kan99b.md": "b7e0669f0a6b677d902204f3427d1b3ac254bfe70c37d9cf995fb3e8f1fedfb1", + "tests/specs/streakline_notes.md": "cd342d214c07eb608ac2e5b8697322c44c31dbf4d27dfdb5409de46ef474df4b", + "tests/validation/run_perf_baseline.py": "93dde2eb1132f45ea69e1e285ff421dc97a83651a22c79571f299c1909650721", + "tests/validation/run_j1.py": "51b758a271ff358f931b3140a80082294a67e66c2fec0f8c19319e37f92aadc4", + "tests/validation/run_kan99b_rotating_cylinder.py": "323186429a100f36b41ab9b81ade2da6a47e93be3ccb7034a3a6b97f4ee8eb00", + "tests/validation/run_j2_slot.py": "b7d2d3aa06fcafc3ac62ed4a50892afbdb7f86e5720ce75a39ce317b6f571dad", + "tests/validation/run_j3_coverage.py": "329869519b7078e854d96241a7aad8ef93f35ac9be83f0be502c3a93523c3b13", + "tests/validation/run_sah04_st_matrix.py": "9b9c0ce063e07a316846635ee769b837ed26be6bf039f78f4219c10b516f8006", + "tests/validation/analyze_j3_saved_frames.py": "438f67dac682b94c4950626f8de4fdcde48c3a4e9ecf8fdf1b0ada4b6e0e781a", + "tests/validation/diagnose_j3_lags.py": "286fcd65b3261667a847b9b26e213d0af92cf459faa6bbd774f78c8479ce31d7", + "tests/validation/run_j3_reservoir.py": "47535bc3569ce68c888d38978bc4f9077fd763a17829c20c081be52bb18a2903", + "tests/validation/run_poiseuille.py": "e529288e2ffa8e00d281a9006723954d60a96ae4d025e8f28656c09287d4ff46", + "tests/validation/test_sensor_accuracy.py": "c6038a9e7a597a1738814bd15e6ecf357cfd271cdc2a132d47943c5280ac0ef9", + "tests/validation/multigrid/test_cpu_reference.py": "ade5d4827f971aed7174b59d83769e7aa542338e625a9fc8db1e8b1805cb74ca", + "tests/validation/multigrid/cpu_reference.py": "bba2a06a9f6517b32079ffff15e4060d8c3b7ed35f16ca134e1877226c9e4e1e", + "tests/validation/multigrid/test_fine_surface_gpu.py": "d45ca48fc4e77d021fcc5461329b094ae11b257c036bb23634d326fbbedb7700", + "tests/validation/multigrid/cpu_reference_v0.2.py": "b6adbad7da625ef6a6b97958ea9625030ed92676d0cada48e061c87bcf7ca8c9", + "tests/validation/multigrid/test_open_corner_negative_control.py": "59a6f8ca80cdd63cb7827fbebf9b4b555c3793f19dd6bca801544ec10b5cbe1b", + "tests/validation/multigrid/test_refinement_followup.py": "6643e26cd877bf0d0f030e974f00a1d1c0f0350cc76d1c8affed3e8ba2f4393b", + "tests/validation/multigrid/local_stress_observable_v1.py": "0e2777990359a7cf2bb29884173b7b01de37c49bcf49e1f29fc59fe83d62b456", + "tests/validation/multigrid/test_refinement_gpu.py": "0021a39b3a131347196845cff6507c90c387b46b772fe1319d634178c5e13354", + "tests/validation/multigrid/shear_diagnostic_v0_2.py": "a8b1cf2f7abd00efc4d068bbd27bb2317144a6ca4c545d9b2e0dcf421eadebc6", + "tests/validation/multigrid/test_tron_additions.py": "8e7a6a90b85e64c7326719e7b8bca2f6d34fb4c80690f0685f7e291ab93bd2a4", + "tests/validation/multigrid/MULTIGRID_VERIFICATION_STRATEGY.md": "d4f3473da44abee6031a0e1bd4d0ca589077a18f15d2461836e4d2ebb98e458a", + "tests/validation/multigrid/shear_v0_2_evidence/stdout_horsea.txt": "0577df5b3f5cb3c7b6e1ef2de71344f8fd3e6d959117487a06cbaf7f2afa3dea", + "tests/validation/multigrid/shear_v0_2_evidence/stdout_grok.txt": "28ddd1267ca91a772f5a6bfc65d949c9a4ea7dac5c9ba3a0bdb168492810b670", + "tests/validation/multigrid/shear_v0_2_evidence/run_once.py": "6698a2e040c56be949b809387d4518eb0ba82d34cc9d99640da4f8bf3c35c23f", + "tests/validation/multigrid/shear_v0_2_evidence/source_manifest.json": "56fbd0259ff3d4dbd14ace52f64e249a435e9df91732b0e4027def2c344c2e6a", + "tests/validation/multigrid/shear_v0_2_evidence/results_horsea.json": "c2d7ce8d16a0f47baff0788a153353dcf67088da974d9cd3d521b04ecd91ee05", + "tests/validation/multigrid/shear_v0_2_evidence/comparison.json": "41c00372099dd04b6d323785e9eaf4fec09da1753d3d150ffa230800f904142f", + "tests/validation/multigrid/shear_v0_2_evidence/baseline.json": "98a7853341ea732762c7506694e3a867a7259bf110e9e461ea84f741fd9ab829", + "tests/validation/multigrid/shear_v0_2_evidence/manifest.json": "e42aa19e91608164698bea42da88fbbfab8b0f87cc37b27c5baf165453a4fdb0", + "tests/validation/multigrid/shear_v0_2_evidence/README.txt": "4306a34b6896bd6e7a5c2ca71d68e18450359239d0c7ad7a67a4e83e7155959a", + "tests/validation/multigrid/shear_v0_2_evidence/joint_report.md": "1860b8082108c8b8a87998af90cd0b81dce1c04e9f6c67b41e0912f9fef6cc9c", + "tests/validation/multigrid/local_stress_v1_evidence/stdout_horsea.txt": "882f2cfb1dbdf82cce63c011397e7c2e6307bbcfec42a3510648d328cd6ddcfe", + "tests/validation/multigrid/local_stress_v1_evidence/run_once.py": "e629800291ef65ffea8555f66ec80bf15200552540b2a493a677bfb53d0830b3", + "tests/validation/multigrid/local_stress_v1_evidence/source_manifest.json": "d2cf90b73458f493c665c9a281d06aef0c190cf0d143639fb77ab838c78f020c", + "tests/validation/multigrid/local_stress_v1_evidence/results_horsea.json": "f17b4644d19eb75d55deb7021ab679cb9e7922a2b46f1cacf8b6da6bfb9a2690", + "tests/validation/multigrid/local_stress_v1_evidence/comparison.json": "be236671a501c31c06f7e266f6e0c0c2a89aede321a483452050ff37bf84c84a", + "tests/validation/multigrid/local_stress_v1_evidence/baseline.json": "64f6541447afbd15b1b15d802ad6f1b5042aaf84e7d4d2414e4ed4c52cf70507", + "tests/validation/multigrid/local_stress_v1_evidence/manifest.json": "3a9fa8c7d691c1b8c24f05940eb724d30b890dd8ed636551068d2633d7db2f70", + "tests/validation/multigrid/local_stress_v1_evidence/README.txt": "4f62314876047ee437bb9ecbf84798d2a9f6e85f6a3aef260277b85bcdb35fae", + "tests/validation/multigrid/local_stress_v1_evidence/stdout_local_stress_observable_v1.txt": "6a826e5ad729ce45af6879a07a1c659d8b4a21403fde5b9c6d9696cc6a5b09d4", + "tests/validation/multigrid/local_stress_v1_evidence/TABLE_local_stress_observable_v1.md": "d8ff0568d9c473a4bb09396a8948ddc8dc5af2f0f3a23ac84d238814fc779501", + "tests/validation/multigrid/cpuref_0_3_evidence/stdout_horsea.txt": "457f1d2173496554c87ca6e61df518c0b8f1e0a28cdfd94b94ebbb61bc459d70", + "tests/validation/multigrid/cpuref_0_3_evidence/stdout_grok.txt": "73e4ef01138842981daaa534390f1463839e63833c11f4e8872f94f8eaadc717", + "tests/validation/multigrid/cpuref_0_3_evidence/results_horsea.json": "914389afc39752bcd4132aa21fc8d5cbcf0ca75b1efd6a49becab15c2fa3361b", + "tests/validation/multigrid/cpuref_0_3_evidence/baseline.json": "0daaccee41cabeb17a00e2405e2c7fd0b80d36f2d01778eb39c9fd22b13d2d47", + "tests/validation/multigrid/cpuref_0_3_evidence/manifest.json": "2850ecaf2e19d010ba35eb54162371d82cc1a092831e08a03b6adf75a614988b", + "tests/validation/multigrid/cpuref_0_3_evidence/README.txt": "1947ee0232b88b3cc2c506d0b0af5ba051ecc94aa8f7f09228ef3939cc95919b", + "tests/validation/multigrid/cpuref_0_3_evidence/README_grok.md": "065947e15b2242bce7d3eb05a3acdbb59939c621dcd5d31540ad4a1bd4416818", + "tests/audit/\u5ba1\u8ba1\u62a5\u544a_kernel_layer.md": "89893c98ed7c2699157bf728ec0e79b0dd6aff4008ee5c7b77eb052de24033f1", + "tests/audit/body\u91cd\u6784\u7b14\u8bb0.md": "8f978d7b01c9f49dca9eeaff0d163cec6da085e2f99ee5a5e803d72306e7a72f", + "tests/audit/\u517c\u5bb9\u6027\u6d4b\u8bd5.md": "9c1721a33b381b9c3810545772b022913da06617711b5ba13a3c2c991b81a7f7", + "tests/audit/Force_region.md": "3092080afe4a30665fe1b721803621ba9d0dd5d20ad17826984d94efc160fdac", + "tests/audit/\u5ba1\u8ba1.md": "0f14ad073a0725134e6391f961c324fd0013c7791fd410713e94ed1ad40b7385", + "tests/audit/Force_region_validation.md": "279a4484d1bfca0fd67aed4de3282d547aa048f89389420d8e5f2fd86db54fc2", + "tests/audit/body\u5220\u51cf\u529f\u80fd.md": "e9f308a8cd0f0e7df5441c32a15f84c0bae50bc0e56b8728f6c6f2cf78596673", + "tests/unit/test_initializers.py": "8b4e3358d925614984265ae73c142006b48fd1c3918cf84901f18afd9fe68c3a", + "tests/unit/test_simulation_lifecycle.py": "77abdc33218c35e9c8b62dbd99ceddbaccd8417e7f0b539ea8859ea0175c663a", + "tests/unit/test_numerical_operators.py": "6d1d560ef553a2af7adac7db3e325d96d7fe39073d5fe3e0e982439537385b27", + "tests/unit/test_fine_surface.py": "b232b55e75eef52480f06a35c401d72b6145892bb8b79d1d1b3cfed965b3506c", + "tests/unit/test_sync_plan.py": "983313ef783143231fa5a392f85f3bac011184773ccaf5d946504c206cabb721", + "tests/unit/test_surface_actuation.py": "89be6f54c4eba6c2bdca0d287a5b9fa6db143de2bcd9a671d4fb8445921303ed", + "tests/unit/test_state_regressions.py": "0f69cfeb83428192f95688c76abcae7e5b9cf5f27c52bca4ac20c7f320044374", + "tests/unit/test_equilibrium.py": "1ecbcc4547b1c846b75320463d828d6a36b6aae73208084fae476b1001c1bb50", + "tests/unit/__init__.py": "17f57920d9c1ff46096ceb2af008eb38c4b98dc81ffa3c3d310e758e80ca1cd4", + "tests/unit/test_pending_edits.py": "905a0dff23b123e8e38aaf364984c810fe51c39acd64aa271e343a4701d3d024", + "tests/unit/test_planar_velocity.py": "b656da0880b4234b1db805544edbe0d2473cbcc7c2c869c71d8251337f62a982", + "tests/unit/test_body_flags.py": "ac6409157924e15a13a3d2cc2f1a09014b8b0198ba17c824f412ff20b19e2aac", + "tests/unit/test_build_contracts.py": "7bb237425e8bb481f312fa4841c484e280731e13c7cbb9a53dad3e7f98984ac3", + "tests/unit/test_context_ownership.py": "299fed30dd0f9bd4dadd8b27f50df2a6367bdb0ab2ca3f391f215fde7241f35a", + "tests/unit/test_reservoir.py": "e718c78a53c3941aba7feb8ae4e8bb0b1726c1145de84febf91220c1917991c9", + "tests/unit/test_refinement.py": "90751142f920f1c5e988577a45afa94871a6617009cdc78323a87fc7795f4634", + "tests/unit/test_slot_velocity.py": "6a9494de9a32c350389ccbed58af48951f6b25a21a258537d2e8b73eb67cb11d", + "tests/unit/cpp/semantic_regression.cpp": "99dba074c0c0a32ea76026e7d54fc60af8e6d3dc5315c8900c470b4518878f39", + "tests/unit/cpp/reservoir.cpp": "c3eacaf0271400eb45ad559b571a8f7faa2a809d5f1857ffeb5592addce2cd0c", + "tests/unit/cpp/collision_regression.cpp": "f17acdff74ab82a62dc5402b42e3f6a149c262e89b140494164d6ebd630f5e14", + "tests/unit/cpp/slot_profile.cpp": "31ac58ccab175bf79fa59fc46d4c0842df18ab0a5e5916be84760d9da2b75788" +} diff --git a/research/fine_surface_joint_20261014/baseline_01.json b/research/fine_surface_joint_20261014/baseline_01.json new file mode 100644 index 0000000..548cf7b --- /dev/null +++ b/research/fine_surface_joint_20261014/baseline_01.json @@ -0,0 +1,182 @@ +{ + "tests/unit/cpp/planar_velocity.cpp": "8dea266984edc69d4e0e68007e038d7a587e99f84e33478d6656a66a56680933", + "tests/integration/test_body_sync_e2e.py": "d29f01771f3512a4b3ad06fae4ee952327d7fd9f0476942402fe92e9e327fcec", + "tests/integration/test_sync_bodies_skeleton.py": "65f55a0980659b49ae0027f0642a27e2ebaead226ef083f233e878150884b07c", + "tests/integration/test_numerical_gpu.py": "002a6745929bd5ee86a9491ea9bc3f97602fb825ea17262ea190c9311881100e", + "tests/integration/test_ddf_patch.py": "dda2abba32ca13e17098232f2831a0b1b66439c35f8931d9997a0257250c1281", + "tests/integration/_cases.py": "ab76ca1096d2d10fb05b3539aa8ed3c7e549619bae6900ac98723f6c3c908f2d", + "tests/integration/test_surface_actuation_gpu.py": "3c2b4dda70db1d6493ecd92bd9b0dad6d8b438cdf6dca46410018217f8beb4da", + "tests/integration/__init__.py": "c354e43ba09b55a8013a2df2069438740b5f48b5917d855e52e33ab5d7da5a6c", + "tests/integration/test_state_gpu.py": "dde0948941e8abbc5ea10a3acb3a35abbaea576f36ecee0f1120fbcf7454d60b", + "tests/integration/test_runtime_contracts_gpu.py": "775e578e2e8072af32fc740b2698abbb79454235a0f3ee929ac4c75d747f8db5", + "tests/integration/test_unified_obs.py": "4a681536099741d92bdc258525fe3374cbdbeba0d49996e53808381a1b6a13fa", + "tests/output/exp_ctrl_matrix_streak_ny300/summary_C4_deceit_f1p5.json": "11dab8440d8c4f385061d2536403f4313c6f026b4e0b7672681327a9f4f37ebb", + "tests/output/exp_ctrl_matrix_streak_ny300/summary_C6_deceit_f2.json": "e0c4e8bcc55da5dc8de1e2fe88029aa3e67453734faa44451f5a6dfa9131557f", + "tests/output/exp_ctrl_matrix_streak_ny300/streakline_C6_deceit_f2.png": "e0a66708ce2a29c4c6b854d2596b3ffca181dc6e35d99cc94e08af3e2d8c024e", + "tests/output/exp_ctrl_matrix_streak_ny300/summary_C3_deceit_multi.json": "24c8e433aab6d207dab67546c4079868c4244c2948c32c94cd08e4f331991807", + "tests/output/exp_ctrl_matrix_streak_ny300/summary_C0_no_ctrl.json": "cf3af733a08f081cc5f879e8da79d7c60104099f4452af5b2a4a96c0e6bd5889", + "tests/output/exp_ctrl_matrix_streak_ny300/summary_C5_deceit_multi_f1p5.json": "a4cb4ff4481b39b9ee61b1d7209416237a7fe86b22c5068d713ccec9c3f7afe4", + "tests/output/exp_ctrl_matrix_streak_ny300/manifest.json": "d8a20dacc92321d98354684976f771a9ca8989fc63ddcd78e15c7768c6617671", + "tests/output/exp_ctrl_matrix_streak_ny300/streakline_C3_deceit_multi.png": "c6fed617cc6ffe6677157a9b58811d5f4613725eb98a5aec830fd07dc1aac38e", + "tests/output/exp_ctrl_matrix_streak_ny300/summary_C2_deceit.json": "7526a6b20a158461b85b1a64070b46c2b21be1e01c5ee025e6746fcf47ea3397", + "tests/output/exp_ctrl_matrix_streak_ny300/summary_C1_stealth.json": "63d34a0ab33e9fa8fe7311363efbd1b2875691f5b4958bb645b8c7ac38f1ad6b", + "tests/output/exp_ctrl_matrix_streak_ny300/streakline_C0_no_ctrl.png": "0cfd7ce8f9d743bf22a7a694b4e5a3616557cb8f1db2f4ddf49cc4bef96efef2", + "tests/output/exp_ctrl_matrix_streak_ny300/streakline_C4_deceit_f1p5.png": "4dcfc186928dcb83d28e9eb4cb2ecb4b163eb6f121d57036b4c05ab162be0951", + "tests/output/exp_ctrl_matrix_streak_ny300/streakline_C1_stealth.png": "5e3cbbefda06fcef243d7d06d74a473972350cfa4ae88bdfdb349dce13943151", + "tests/output/exp_ctrl_matrix_streak_ny300/streakline_C2_deceit.png": "22f1db77499bdbd1b3cd35f5b58b1a884dd94a86fdcfef07abd4157e6aaf8d19", + "tests/output/exp_ctrl_matrix_streak_ny300/streakline_C5_deceit_multi_f1p5.png": "823e475cc901af3d6f4d0c56eb07822b3e73a2b9d0aa23e20e3741023fe90092", + "tests/output/kan99b_validation_esopull/summary_runs.json": "fe3294a953580204319fb1143434e15096d8455b6073100dfe0d5491b76af394", + "tests/output/kan99b_validation_esopull/summary_runs.csv": "1a44bb27ee0a7fe0270905248c37364834248cdc8710bd68142a6a79bbdad82b", + "tests/output/kan99b_validation_esopull/force_csv/k2_k2_inlet_control_domM_re100_a1p000_zou_he_local_mrt.csv": "9fbc7d507c129ed85c68a9a313e3eb3431470d091bd7723e63f8afd8a3d2b737", + "tests/output/kan99b_validation_esopull/force_csv/k2_baseline_domM_re100_a1p000_regularized_mrt.csv": "8faac43f42d6e0c70085c6e616bfff4df8de897e315fc0d2b4aa8bd635c3fa05", + "tests/output/exp_ctrl_matrix_vort_nx1500/summary_C4_deceit_f1p5.json": "b613ae55fcfbd45a1a922d6d529e5274ba9d2987fdf5620fe866b889b931e48c", + "tests/output/exp_ctrl_matrix_vort_nx1500/summary_C6_deceit_f2.json": "dbf54f9a183072547b22fa14334f0167e6eefb21c1208c4e8584bc196545a399", + "tests/output/exp_ctrl_matrix_vort_nx1500/summary_C3_deceit_multi.json": "2100c6cc5c358a249804ce8f6f98531f3bc868e27af6d21a9d441b1b6a9e479e", + "tests/output/exp_ctrl_matrix_vort_nx1500/summary_C0_no_ctrl.json": "a8b4697b7c0caeb958f80e282e32d673deac8c914008d64e6b38f7883eacc57e", + "tests/output/exp_ctrl_matrix_vort_nx1500/state_C6_deceit_f2.h5": "8d0c28566d2230b422691b738cc453705496bd150be038a576c0c0fba218fc1f", + "tests/output/exp_ctrl_matrix_vort_nx1500/state_C5_deceit_multi_f1p5.h5": "608767ca11d104fa4506b57204a0c8dbd739688224ebd924fe517ce9e21db823", + "tests/output/exp_ctrl_matrix_vort_nx1500/state_C1_stealth.h5": "a83c988cc8b1173a7b2f13b132ed7243e98304dccab2965aa16cf4d32f8df007", + "tests/output/exp_ctrl_matrix_vort_nx1500/summary_C5_deceit_multi_f1p5.json": "6f6b9300782178e0ac9308a677bd9cb1565a383a78dff4cd52dea0bd464db31d", + "tests/output/exp_ctrl_matrix_vort_nx1500/vorticity_C6_deceit_f2.png": "21bbe2dac1ab06ca1b172ec62d00daa7bcd65d99adac0ed03c5e30bed59e871a", + "tests/output/exp_ctrl_matrix_vort_nx1500/vorticity_C5_deceit_multi_f1p5.png": "602a6586277699968b4cb167b134c8c406577038af088aa70baff682691398c4", + "tests/output/exp_ctrl_matrix_vort_nx1500/vorticity_C1_stealth.png": "c1e1d04f266deac5fb2815a8283da80f9139ffaccbec2219d98544296bf3152c", + "tests/output/exp_ctrl_matrix_vort_nx1500/vorticity_C4_deceit_f1p5.png": "96dee924e89b90091192a8d7b43321f109a5491511b8a83da77cfc611ae0d93b", + "tests/output/exp_ctrl_matrix_vort_nx1500/state_C2_deceit.h5": "aa5800a0cd594eeb7cf5449d6469d55e0c9033ced0ee0a3b5d59152e68c7e263", + "tests/output/exp_ctrl_matrix_vort_nx1500/manifest.json": "5d28f0f5428d7f0341e20d5d1f19c17bbc6f0f9b2a441d3c95f5422f3f2b4bd4", + "tests/output/exp_ctrl_matrix_vort_nx1500/vorticity_C2_deceit.png": "1dcb6fb959f944d7ad89c4abaaef4d1fd4a77db8901804530e86fb336b883eb5", + "tests/output/exp_ctrl_matrix_vort_nx1500/summary_C2_deceit.json": "b88ff5049aef59876b349d105f1c3467c17c9ba9022a48a77a6984f20da34345", + "tests/output/exp_ctrl_matrix_vort_nx1500/summary_C1_stealth.json": "515689cbfaa30a9e39d9907939ee194a4836b644a5e9124586e6b7221d2b394b", + "tests/output/exp_ctrl_matrix_vort_nx1500/vorticity_C3_deceit_multi.png": "d69694a1a1b2f2ea0adc7b74b7526504e2ad0b5d6317bac9b3159b2e7e88cf90", + "tests/output/exp_ctrl_matrix_vort_nx1500/state_C0_no_ctrl.h5": "3a858d6be0a946e1d26bbfa192c2f0ca3910c0f140b42575ec9d9529dd99155a", + "tests/output/exp_ctrl_matrix_vort_nx1500/state_C4_deceit_f1p5.h5": "660e4619ea530dcd18c3afb2e7fa22cafd9cdba1be7888e31ab5b76a0902d2fc", + "tests/output/exp_ctrl_matrix_vort_nx1500/vorticity_C0_no_ctrl.png": "6d4d3934f1c8b20c2a5c742ae080a7143f0c139741966adf009a227c27e9bb1f", + "tests/output/exp_ctrl_matrix_vort_nx1500/state_C3_deceit_multi.h5": "1e72126f11b2995437cecb8cc0eeffb8807efbfa43d8f346f28711fea98ddc90", + "tests/output/kan99b_validation_ref/summary_runs.json": "449316c30585a8de9997538dead5d4e35a59bf00a2ac22d01b101ab600a4bc06", + "tests/output/kan99b_validation_ref/summary_runs.csv": "e8b9620f3772e5e421026103e456e6e844a91292f40affb96174c9dbde9b6e4e", + "tests/output/kan99b_validation_ref/force_csv/k2_k2_inlet_control_domM_re100_a1p000_zou_he_local_mrt.csv": "4391f41d17ebeea1092f13b901923ced4ee2a1c5b346b79ef791d692847286b5", + "tests/output/kan99b_validation_ref/force_csv/k2_baseline_domM_re100_a1p000_regularized_mrt.csv": "105c6eb21f1943d9d935246eab1602ff2016c415a139e24fee2793e88e006ead", + "tests/output/exp_ctrl_matrix_vort_ny300/summary_C4_deceit_f1p5.json": "0085a679a423621003eea81d4ac83bfe2edef2879eed7809d2a3675a212f791a", + "tests/output/exp_ctrl_matrix_vort_ny300/summary_C6_deceit_f2.json": "e820cf73f0e90bf93c34b24416e7692a6c2e51352ccf490fa6714d0812331ca2", + "tests/output/exp_ctrl_matrix_vort_ny300/summary_C3_deceit_multi.json": "571370c74ad9af589f3dc214669bff3d857efe6fc4fa13815b5d793d12b53770", + "tests/output/exp_ctrl_matrix_vort_ny300/summary_C0_no_ctrl.json": "ec5b89961033d8ebe0d66ce1ec7940dc2faf98130c38319bc9984ef654e60b50", + "tests/output/exp_ctrl_matrix_vort_ny300/state_C6_deceit_f2.h5": "2792be74d8564fa29fd0636fc8493630fba2779c165b44330197095b3e296b18", + "tests/output/exp_ctrl_matrix_vort_ny300/state_C5_deceit_multi_f1p5.h5": "2c64ee6c7a4ea2c42ed8f3d274402bec62de0e02ea0340e16022f0cdc92af724", + "tests/output/exp_ctrl_matrix_vort_ny300/state_C1_stealth.h5": "100727d94fe6c2e46d7807eed0442555bdd1e26ec9b04b4c457171a2bbba3255", + "tests/output/exp_ctrl_matrix_vort_ny300/summary_C5_deceit_multi_f1p5.json": "f86166f121b4eeb6d74d8176c9265e7a3ccfe2540d040f554b6f96e6a6222c16", + "tests/output/exp_ctrl_matrix_vort_ny300/vorticity_C6_deceit_f2.png": "fef4de0e3ac8203742f35c16a02445b19c3f556b11f73abd5d8e3ca05ca33d78", + "tests/output/exp_ctrl_matrix_vort_ny300/vorticity_C5_deceit_multi_f1p5.png": "9136448e6d7565ca5af3666f9cf6e154342d8a3475076abfdbdd1ff9faec34f3", + "tests/output/exp_ctrl_matrix_vort_ny300/vorticity_C1_stealth.png": "544537a9c500a05937fd3be17c25e7d887461d9b83a15564f9ab7063208f40f6", + "tests/output/exp_ctrl_matrix_vort_ny300/vorticity_C4_deceit_f1p5.png": "51e7056db99dd653affbe913d52fa41df6ec0db921109384e3c679bda06b5a83", + "tests/output/exp_ctrl_matrix_vort_ny300/state_C2_deceit.h5": "39d6c162085acae1612650da37d2314757715931e83a854e08bb01407d0f8efc", + "tests/output/exp_ctrl_matrix_vort_ny300/manifest.json": "05fbc2e7bbad4267a38e1094bbdd6bee6ad270412bdb5e92b0dfc9fa56969517", + "tests/output/exp_ctrl_matrix_vort_ny300/vorticity_C2_deceit.png": "07fc5817eba30371272b87ee2e023c0a1144077d1bef77efb2fd5dc284badcb7", + "tests/output/exp_ctrl_matrix_vort_ny300/summary_C2_deceit.json": "b1fcf76039c91a9080b830352dee2e95316d754b968cc27a8f68c51527661e76", + "tests/output/exp_ctrl_matrix_vort_ny300/summary_C1_stealth.json": "b78851637b9b7b93070524a2933cae1dab6d682f8894579b2849c64921e6c29e", + "tests/output/exp_ctrl_matrix_vort_ny300/vorticity_C3_deceit_multi.png": "2658f0747ed7287f7912fe15cc58a086e01ba284277cb98689bac01ecb6ec12b", + "tests/output/exp_ctrl_matrix_vort_ny300/state_C0_no_ctrl.h5": "57f73f5f8dc4b32b156bc82300b1efd1e4eddadd9b8dc51cb7e6b41fa5c966bd", + "tests/output/exp_ctrl_matrix_vort_ny300/state_C4_deceit_f1p5.h5": "2864b9dd086709ee8b8c3f262118a5130b0d40c86838f3ca0deab5bb898dafa8", + "tests/output/exp_ctrl_matrix_vort_ny300/vorticity_C0_no_ctrl.png": "2c7f3a8be2ee540afdfb66299e43a65583434bee84bde590124524a82868c900", + "tests/output/exp_ctrl_matrix_vort_ny300/state_C3_deceit_multi.h5": "39e0d9b032dfff8cf057b410a98973729285e7d03e89f9a6a002aaf7de3d7519", + "tests/output/stealth_sweep_fix_check/summary_stealth_s150_w0.02709.json": "8b1032e13975bb05c6a810fde175c8da51bacdb3dc745fd11c1049ca63bbf136", + "tests/output/stealth_sweep_fix_check/summary_stealth_s050_w0.00903.json": "fa7da24d5dab9fd3a3c2dea6b50d0224c7a99cd9141796e137304a6040b1ac8a", + "tests/output/stealth_sweep_fix_check/streakline_stealth_s050_w0.00903.png": "640928f7eb159e7caea32036123f86c281723d083cca46839ba86bce8361ada7", + "tests/output/stealth_sweep_fix_check/state_stealth_s050_w0.00903.h5": "187ac365f9f7370c888c4c65570c47e42465b2fccd432056c176528d45cf0c2f", + "tests/output/stealth_sweep_fix_check/manifest.json": "83a3f12a942fb644e470bd07a72f24921f2147d7df429110268c5c96a9953d1a", + "tests/output/stealth_sweep_fix_check/state_stealth_s150_w0.02709.h5": "e057e9db26b2546c0704e2c959cc7d2aac91e6a49b4c7ee75a409597a5db8716", + "tests/output/stealth_sweep_fix_check/vorticity_stealth_s150_w0.02709.png": "d2d202088624cf30868228f9c913ee30e1b386aaa2c22b0ea89be43dedc0712d", + "tests/output/stealth_sweep_fix_check/streakline_stealth_s150_w0.02709.png": "0edc7caa9caaffb754490bf1f6ac7ad7180e45a991439a3f4f83ed949a082a1a", + "tests/output/stealth_sweep_fix_check/vorticity_stealth_s050_w0.00903.png": "4088359b17c46ed4d7c8401d244808fe67723273b1d16d0671b69f9478c68c1a", + "tests/output/final_validation_round/validation_summary_report.md": "881cb7052e5a555afc87168a37268ee66e8e3fba172533706e858d996fabc7b9", + "tests/output/final_validation_round/sah04_mixed/s2_d48.json": "83c6c01201d90aae5c49e73ebeca88d1c7ded6cc83c13f4892a9188e6289483f", + "tests/output/final_validation_round/sah04_mixed/s4_reg_d96.json": "b32f03e6b347fc709cea2ecd488df0f85849c733bf6a4b9cf65ea69401c93a1d", + "tests/output/final_validation_round/sah04_mixed/s1_d48.json": "120e8e878f5712dc89b7cf78c7f8d0e3368d34ad5ef7494977e083b188a54c18", + "tests/output/final_validation_round/sah04_mixed/s3_stablecfg.json": "b38a3d197a188e65c163d974113af18f332b3abed083e2654e998d9980f6be9f", + "tests/output/final_validation_round/sah04_mixed/vorticity/s3_mrt_laststep.png": "dc96fcd05d458684cfb40d4cb741172213083e2f2665e2bae7e1f0267bb3575d", + "tests/output/final_validation_round/sah04_mixed/vorticity/s1_mrt_laststep.png": "73a3580ba3c7fe6ffeee4676a9a51b5bf678d6fb523456a61e185598389ea1e1", + "tests/output/final_validation_round/sah04_mixed/vorticity/s4_mrt_laststep.png": "57f2a82761f2de1a9fc2b78ee86159ca542c966494b9c704deb451da857da778", + "tests/output/final_validation_round/sah04_mixed/vorticity/s2_mrt_laststep.png": "786f492b96ed932254b5452e2d06ff088727f2d88c7e7c7b47d386eddfe07862", + "tests/output/final_validation_round/kan99b/full_summary_runs.json": "8c4a11cbf555e08a66698439170b850c57d537d8e75e4dd75beb767bbf7e38cf", + "tests/output/final_validation_round/kan99b/summary_runs.csv": "3fa92fdd3114f0472de44bc03006af1d4b694dfc69b06704c1667cd3627b6dab", + "tests/output/final_validation_round/kan99b/force_csv/k5_baseline_domM_re160_a2p000_regularized_mrt.csv": "de05e9699146f2adffc9d7c9991f9e48396aacd142afc3c08b2b64727c83c69a", + "tests/output/final_validation_round/kan99b/force_csv/k3_baseline_domM_re60_a1p600_regularized_mrt.csv": "53cd0dc47328b7b370eced1130508655e6815a29b727bf1fe4e4e125e4918905", + "tests/output/final_validation_round/kan99b/force_csv/k2_k2_inlet_control_domM_re100_a1p000_zou_he_local_mrt.csv": "4cac1ccfdb7451de3e26d921a6406cc55d1d4630e10ec0d7ec9350a4abd49404", + "tests/output/final_validation_round/kan99b/force_csv/k4_baseline_domM_re100_a2p000_regularized_mrt.csv": "392c98de52011ddb344a5761c4520e870f4e49bbba3e144e5a02818ba2f9250b", + "tests/output/final_validation_round/kan99b/force_csv/k1_baseline_domM_re100_a0p500_regularized_mrt.csv": "9e83c5175aec644c0b97c081e610deefa731b87aef04da6297abf662a71c0702", + "tests/output/final_validation_round/kan99b/force_csv/k2_baseline_domM_re100_a1p000_regularized_mrt.csv": "55b071f278e153aa353aa2bef85f0bce35b910a7b08103032023fe3a28169b89", + "tests/output/final_validation_round/kan99b/vorticity/k2_k2_inlet_control_domM_re100_a1p000_zou_he_local_mrt.png": "b91b332e7deb787975d3f08fa3325facd4a972b536694fcda52e6c01943c42cb", + "tests/output/final_validation_round/kan99b/vorticity/k1_baseline_domM_re100_a0p500_regularized_mrt.png": "6e7c3f6567c0ff0d00d75da8373031f5ba2a17a624cb8c5d5d6ae4f8749c33c0", + "tests/output/final_validation_round/kan99b/vorticity/k5_baseline_domM_re160_a2p000_regularized_mrt.png": "c4d232df2e6f7466acca711191d976aa9411ec0ade81572b531463f42a7d633a", + "tests/output/final_validation_round/kan99b/vorticity/k3_baseline_domM_re60_a1p600_regularized_mrt.png": "b2314c60491d20933422e1697998555dec2436d39545c71f990e9906884685b2", + "tests/output/final_validation_round/kan99b/vorticity/k2_baseline_domM_re100_a1p000_regularized_mrt.png": "2b2797b8f53170d04d1a70d1cdf898f7e41b3a76b9f3c1f276dfec952520ab04", + "tests/output/final_validation_round/kan99b/vorticity/k4_baseline_domM_re100_a2p000_regularized_mrt.png": "8135f470404fe11ac97968fa580ee35232e90dcace3c6ad94de17ef7aace24d6", + "tests/output/kan99b_validation/summary_runs.json": "d7239aac64884202558741074f2d644ade9e2365d94d0b7556fba68dac94868d", + "tests/output/kan99b_validation/summary_runs.csv": "c44da69563d58b917291a9fd402d1f57055861bffab6f9e32d7db91297428d45", + "tests/output/kan99b_validation/force_csv/k5_baseline_domM_re160_a2p000_regularized_mrt.csv": "27b64460923d235d34b760f2a2371ad01611a70e38edb03d6fd6a2fe7a7de6e0", + "tests/output/kan99b_validation/force_csv/k3_baseline_domM_re60_a1p600_regularized_mrt.csv": "76ff52f4494b7ef7650c05968732a8caaba94d2b151234c02cf624f5b3a712ab", + "tests/output/kan99b_validation/force_csv/k2_k2_inlet_control_domM_re100_a1p000_zou_he_local_mrt.csv": "28a83436ca8bdad38865ba21ce1bda679562a5ae1cfc6ee8fc6e86ff760ec66d", + "tests/output/kan99b_validation/force_csv/k4_baseline_domM_re100_a2p000_regularized_mrt.csv": "823ae04870fd951879024a18169ac5cba8db4b3201726f6a00f320f1958d04c6", + "tests/output/kan99b_validation/force_csv/k1_baseline_domM_re100_a0p500_regularized_mrt.csv": "a591daf2cdecd6ac3689fa2a2aba917b23053ad26e3ef1f635c81aecc451475f", + "tests/output/kan99b_validation/force_csv/k0_baseline_domM_re100_a0p000_regularized_mrt.csv": "e95c27c646c0c9baf8f455f876c115c8dbdb23cef9d9d550f455098bf0c03b55", + "tests/output/kan99b_validation/force_csv/k2_baseline_domM_re100_a1p000_regularized_mrt.csv": "3c2ea79a0e27f561215febee2e165d24b3617a648bf908981c068ba59d549c51", + "tests/output/stealth_steady_sweep_nx1500/streakline_stealth_s125_w0.02257.png": "a892f18c74fe13efd839bfd5068097ca0ae07acebf6c06eed89e1b867e41fcb2", + "tests/output/stealth_steady_sweep_nx1500/summary_stealth_s125_w0.02257.json": "7e542f59746429022ce1794854c6fb36e8ac658dd0aea3bc1140a45e83a3f1c9", + "tests/output/stealth_steady_sweep_nx1500/summary_stealth_s100_w0.01806.json": "b76216e0fbee00ef754edbafe5790a99ce7d53638af629947ddd9615598e4c08", + "tests/output/stealth_steady_sweep_nx1500/summary_stealth_s150_w0.02709.json": "42cb241d9cfb01308ce28e129756b6cb3fe2a8e9679518da84bcb8b607fe92ac", + "tests/output/stealth_steady_sweep_nx1500/state_stealth_s075_w0.01354.h5": "558be308dbf334832bc1d29419ba5be142969117a11b124864f6b221c8fee509", + "tests/output/stealth_steady_sweep_nx1500/summary_stealth_s050_w0.00903.json": "53b579811a0b651ba7cc466c230c115b9f88486c6675e0465d0715d3377a75cd", + "tests/output/stealth_steady_sweep_nx1500/streakline_stealth_s075_w0.01354.png": "9f4a7d89b2471becaf31e84c14402441c5fd96fc7190cea5e8a9fdd06ee62002", + "tests/output/stealth_steady_sweep_nx1500/streakline_stealth_s050_w0.00903.png": "5f18f56b0ff2af3350216b65540a2bc664c569520624cfc6cc2439a3c5369560", + "tests/output/stealth_steady_sweep_nx1500/state_stealth_s100_w0.01806.h5": "30776f333959e0e9eb5ca96b269e6a8052c5b94941a4e3b36d8a6af8076920ce", + "tests/output/stealth_steady_sweep_nx1500/vorticity_stealth_s075_w0.01354.png": "b5393474d99191e88dafea4144b6a8eccfbdf75107125ce4b05383b17007d06a", + "tests/output/stealth_steady_sweep_nx1500/state_stealth_s125_w0.02257.h5": "4ed9d8587f75ad4625ec5501fa99fb733cde037180ac53f92a210ffbb08375de", + "tests/output/stealth_steady_sweep_nx1500/summary_stealth_s075_w0.01354.json": "ff1c1cc649e589b5425787493c2b0d04b6c39b43043b1968d65509cb0a426e82", + "tests/output/stealth_steady_sweep_nx1500/state_stealth_s050_w0.00903.h5": "4de51584b24095f8cf4480b8941593a5f913332f9396061ed077c9d49eb2ee11", + "tests/output/stealth_steady_sweep_nx1500/manifest.json": "0dfbb2c1b5bf9093fef169e4dc6319edb5c87a1e967e8d558613e2c64a2ca734", + "tests/output/stealth_steady_sweep_nx1500/vorticity_stealth_s100_w0.01806.png": "60824cbdf21170cb4ffd8af0a49e8522c2d79cb2694690ab67995ee973265efa", + "tests/output/stealth_steady_sweep_nx1500/state_stealth_s150_w0.02709.h5": "b22d54a05cbd3138a1fe585a825246989fcff7c00f51aa9312a4185d963db933", + "tests/output/stealth_steady_sweep_nx1500/vorticity_stealth_s125_w0.02257.png": "c1e1d04f266deac5fb2815a8283da80f9139ffaccbec2219d98544296bf3152c", + "tests/output/stealth_steady_sweep_nx1500/vorticity_stealth_s150_w0.02709.png": "bcf098083a73798dc3906807218058cc571435a010234a5a350b585ba9915c78", + "tests/output/stealth_steady_sweep_nx1500/streakline_stealth_s150_w0.02709.png": "3bac21cc75a01429399cec308d6bf5fc8918917def1bf5d7fec1cb6003390a41", + "tests/output/stealth_steady_sweep_nx1500/vorticity_stealth_s050_w0.00903.png": "a675f41df763f0a1ac0a06386315806b24f2571f5dabc8693fcd871a13ed22ba", + "tests/output/stealth_steady_sweep_nx1500/streakline_stealth_s100_w0.01806.png": "92515588596596cc1d691c643fa48cf828492c2eaed96355dcec58109de4b5aa", + "tests/output/exp_ctrl_matrix_streak_nx1500/summary_C4_deceit_f1p5.json": "0393661f08b748428fc366eeecec3b34b9d9a013aa6b151a15b33c7e3c0e1818", + "tests/output/exp_ctrl_matrix_streak_nx1500/streakline_C5_deceit_multi_f1p5_step080000.png": "bffef412087e426b614d8c05e59bd7580ee49bb77319279ddc4c1bf825678c49", + "tests/output/exp_ctrl_matrix_streak_nx1500/summary_C6_deceit_f2.json": "de067f01ef5c11249d67bbe5e02db6f2b4c5590214de02609bca115edf8dee64", + "tests/output/exp_ctrl_matrix_streak_nx1500/streakline_C6_deceit_f2.png": "846badbae81b75f765d89e5a7c4f88aeb5d57f2387511e4f2f84c72a192ea9f2", + "tests/output/exp_ctrl_matrix_streak_nx1500/summary_C3_deceit_multi.json": "eb21d1c69e51f01c1a6be1ce59fe86763089ea5aa667b8872d0186af035b24b2", + "tests/output/exp_ctrl_matrix_streak_nx1500/summary_C0_no_ctrl.json": "780a0d329cb86990a17a088f49084410abb1fad24f659255918e5ddda6b3dabd", + "tests/output/exp_ctrl_matrix_streak_nx1500/streakline_C3_deceit_multi_step080000.png": "ff7836b8229d9a5dd3900f499fe3e7f0c73a61c7109b6e6e79b11a0fb459bb63", + "tests/output/exp_ctrl_matrix_streak_nx1500/streakline_C0_no_ctrl_step040000.png": "f2b56a7e30bcc363ed69fc19705403181ac5de90800eef03039a389a65869e30", + "tests/output/exp_ctrl_matrix_streak_nx1500/summary_C5_deceit_multi_f1p5.json": "261b698723f19526a447679a2be8666c8d0cbf6df81b0c9de6d051960d77308b", + "tests/output/exp_ctrl_matrix_streak_nx1500/streakline_C0_no_ctrl_step060000.png": "0697e0ae06a01154afdcf00330ba870bd8f36d21561a33846ad7ba63fb731179", + "tests/output/exp_ctrl_matrix_streak_nx1500/streakline_C1_stealth_step040000.png": "1de3d7f54e91c5d5850f4358d1872e16fefb36d32a1b6293facb54524e32315c", + "tests/output/exp_ctrl_matrix_streak_nx1500/streakline_C0_no_ctrl_step100000.png": "91f0bf6ed3e854f7f83623a3f19bb12c83b4aac239e3eaa849fbe50e7baddff5", + "tests/output/exp_ctrl_matrix_streak_nx1500/streakline_C0_no_ctrl_step080000.png": "303c1d2d4c49b4a7495365c8cb2bcbfe9bdda7cbc0a7c7dd1f01e8aa62b3573b", + "tests/output/exp_ctrl_matrix_streak_nx1500/streakline_C5_deceit_multi_f1p5_step040000.png": "dd5945458a35d81b31a0e2f3a693a5023d6960474263e7dc86c22367a56cc13c", + "tests/output/exp_ctrl_matrix_streak_nx1500/manifest.json": "0d97efed02f775c25dd8a2d7439f310b715d142ff8d603c9da6ddab197570ce8", + "tests/output/exp_ctrl_matrix_streak_nx1500/streakline_C3_deceit_multi.png": "69022ef9175acf910374ec73848640548b85fc7beb7e6950843f52c10ed7d61b", + "tests/output/exp_ctrl_matrix_streak_nx1500/streakline_C4_deceit_f1p5_step060000.png": "16ba30b8cca0d49e6b76be0bb4f0d14bbf276ca6ec47ebf56907c7534e15c4e0", + "tests/output/exp_ctrl_matrix_streak_nx1500/streakline_C5_deceit_multi_f1p5_step100000.png": "8548b6dff635cf9c92e2baa119866277e3994366eb31aeb30641b03b3d80ee9f", + "tests/output/exp_ctrl_matrix_streak_nx1500/streakline_C2_deceit_step060000.png": "56100f169c3e378b84bfc89c5477d2c142ca043d9f28eaa70bc5448c49c7f4d5", + "tests/output/exp_ctrl_matrix_streak_nx1500/summary_C2_deceit.json": "587cd42d81b1325bbc766d9ca6c1fd3d076bf5a772efd45d056c2c4e3db742b6", + "tests/output/exp_ctrl_matrix_streak_nx1500/streakline_C1_stealth_step060000.png": "e43e95e7126de8cb857154353f161914c225f8c9f17eb44b1ff744249368a4d5", + "tests/output/exp_ctrl_matrix_streak_nx1500/streakline_C6_deceit_f2_step080000.png": "676d21ffc7180d34a6725a8bf49503ce59f48d65500450c3975d01e65162899e", + "tests/output/exp_ctrl_matrix_streak_nx1500/summary_C1_stealth.json": "73040aeb7ef07c538d4687b101c599210e660202eb1c2c3e0894dfbde682d137", + "tests/output/exp_ctrl_matrix_streak_nx1500/streakline_C4_deceit_f1p5_step100000.png": "e22171ef86979c4398c45ada9cd0f5e4c4e5b034f271df5fa8ac9a762a8554cd", + "tests/output/exp_ctrl_matrix_streak_nx1500/streakline_C2_deceit_step100000.png": "0d73042be73b0de8d0a591e56c01e3c802483aa22a97f27e0300cba82c708066", + "tests/output/exp_ctrl_matrix_streak_nx1500/streakline_C4_deceit_f1p5_step040000.png": "a6e95fd5c24052db20d5ece200edcfe5e261c00950ca964c89df9f7335579634", + "tests/output/exp_ctrl_matrix_streak_nx1500/streakline_C0_no_ctrl.png": "d74061347ac3505fad878e330f6cb04d23bdb13082bfa1afa2fda0872f80f388", + "tests/output/exp_ctrl_matrix_streak_nx1500/streakline_C4_deceit_f1p5.png": "3156400eb59fae0638556c2711345f12ca49d951ff09e6464a2271249409a6a7", + "tests/output/exp_ctrl_matrix_streak_nx1500/streakline_C1_stealth_step100000.png": "d69e34c82da98b28eef7f1af29f5d11f400e90f628049f6f5f4a3a419a4a4340", + "tests/output/exp_ctrl_matrix_streak_nx1500/streakline_C6_deceit_f2_step040000.png": "ce1f372b517dd52fc3f3eb066145e04ab6841e43b67cb0f6bfbdb42a6738eca6", + "tests/output/exp_ctrl_matrix_streak_nx1500/streakline_C3_deceit_multi_step100000.png": "07cce6c99dfa7b56dd4d3aa452873a676a5a00e9f046555fa9dda30f16dde488", + "tests/output/exp_ctrl_matrix_streak_nx1500/streakline_C1_stealth.png": "a892f18c74fe13efd839bfd5068097ca0ae07acebf6c06eed89e1b867e41fcb2", + "tests/output/exp_ctrl_matrix_streak_nx1500/streakline_C6_deceit_f2_step060000.png": "80b63bd309ef11a3ebb2f1ef301b49cd8f09bcc25562097d382f859306c9fe6d", + "tests/output/exp_ctrl_matrix_streak_nx1500/streakline_C2_deceit.png": "1edb30dc35e29ad991695353f4b84e0507792935ec75ae9a7904ebdc007a471a", + "tests/output/exp_ctrl_matrix_streak_nx1500/streakline_C5_deceit_multi_f1p5_step060000.png": "93ab8e09e58a64c5dd2eedfdafd27cf4dcfe4e8fae1af64ac71eac509e6ffdaf", + "tests/output/exp_ctrl_matrix_streak_nx1500/streakline_C3_deceit_multi_step060000.png": "f773bdef1c8d718d01b6d6d7735182c04564dd8b5692b359e1dd2f721c774b1a", + "tests/output/exp_ctrl_matrix_streak_nx1500/streakline_C4_deceit_f1p5_step080000.png": "5570fe6a25c92e5c6aa9a5129aa1797ba8ee7418170c7a351f9e35b931a366c7", + "tests/output/exp_ctrl_matrix_streak_nx1500/streakline_C1_stealth_step080000.png": "32d3e700286eb4b46b3bcf757669481affd6ff6b53792d730b5a21da92cc57d6", + "tests/output/exp_ctrl_matrix_streak_nx1500/streakline_C6_deceit_f2_step100000.png": "5acfe36694bb4e628309ff8ae1e839ca0a1f684607165bbc2883436b85208bf4", + "tests/output/exp_ctrl_matrix_streak_nx1500/streakline_C2_deceit_step040000.png": "2c6f2b8d61cc2aaa63631eb6c98d3de26dcef705fa6b66c823ce7b9eef50e00c" +} diff --git a/research/fine_surface_joint_20261014/baseline_02.json b/research/fine_surface_joint_20261014/baseline_02.json new file mode 100644 index 0000000..e0421e7 --- /dev/null +++ b/research/fine_surface_joint_20261014/baseline_02.json @@ -0,0 +1,182 @@ +{ + "tests/output/exp_ctrl_matrix_streak_nx1500/streakline_C5_deceit_multi_f1p5.png": "adbefd0021e2c981d026718de8c63594b9c8e5971901d1dc40835cb69d95b93e", + "tests/output/exp_ctrl_matrix_streak_nx1500/streakline_C2_deceit_step080000.png": "ce8b18e4dd976ed590fcc44075f3fb058ca7b23e15a1624726c181c4dd0c11da", + "tests/output/exp_ctrl_matrix_streak_nx1500/streakline_C3_deceit_multi_step040000.png": "168d21ef24ae198fbfd642f8ca315faad4c7bff2e2c09e16ff7c97e7360ea883", + "tests/output/screening/screening_summary.csv": "3a23c4f2bd54ed5ee9bdb5b6dcdc58eed04519fcf1b4790e0abd1e6c5288fb96", + "tests/output/screening/screening_summary.json": "caf64530f152b6b8ccec82a3c7ba44fa0b3aeb0e0221ef6121857bf62c031ecd", + "tests/output/screening/B1/force_hist.csv": "854bfebe63fb2d140823fc5dbc434a70c317c6ab0bedbd5220cec45665b524c8", + "tests/output/screening/B1/summary.json": "35b4d958bc0fdd6ab6c9c0d1ed50e85d89b04f7be3e34632d6c3ea95b89acb47", + "tests/output/screening/custom/force_hist.csv": "06da0f67b564d5c114332ef3b39167b1ba222fc50045f95303c75c14755b51d5", + "tests/output/screening/custom/summary.json": "1701ed75e5e9ca16127f495ccff1d87de245d81df581e94114c8fca6fbbe77fd", + "tests/output/screening/MR1/force_hist.csv": "f70fbfa748fd0709e225523aaaa72b761db56df4f1d48f105384b94cbc44b31f", + "tests/output/screening/MR1/summary.json": "3d9a0fc19710820e3634ab2143b913b282beb159336567ab9ebf3de2092947bd", + "tests/output/screening/MR2/force_hist.csv": "c947b3c16b8e8f8f85a203cea8cd912bdfc07f96985c1c24a470b644170195ea", + "tests/output/screening/MR2/summary.json": "d2344e9e2517ec76c8b56bfbe3763dd465e24721856992401c57c414763481bb", + "tests/output/screening/MR3/force_hist.csv": "7df1536c83ee466b7195d9c521d3d3b1309acaf142f2855bba51fb279c7612e4", + "tests/output/screening/MR3/summary.json": "ad188eb1b271a6cd0fb4025b456eccac5450776f60db58466f804fc5a0e0ec61", + "tests/postproc/run_exp_ctrl_matrix_vorticity.py": "b7e0c4113111b9b677f321750c0055656ccfa4f45c25fe7846f3ed22f30d1467", + "tests/postproc/vorticity_triangle_clean.png": "f831b8143b50f038d5920a0658469622655f34176d30cf7216feff108aa2ecaf", + "tests/postproc/run_kan99b_streakline.py": "a2bbf3fc629ea170d2d4879317dbf2b81c43378a328100ac1f2ee8d9895666cb", + "tests/postproc/streakline_triangle_clean.png": "aa6669de7af6f82e98af25698a15f494e9cea20cb911ad9a30fe52597d33bb79", + "tests/postproc/experiment.ipynb": "c6b45db1c57200f0777213ef8d44cb4996c1aa7a5fb42b968b77e56f51b4fca4", + "tests/postproc/run_stealth_steady_sweep.py": "3c32c4dede7da77fd6cfbd3f7b1ff43bb11390aaba621883ec96c6c7fdad5af7", + "tests/postproc/run_exp_ctrl_matrix_streakline.py": "529d5f31a3862080f890c65177502b589710b2d960ddf131abaf7dc2f9e2a96f", + "tests/screening/run_config_sweep.py": "5030c99923815ed6ad39110cb56f748c579ff4c66c7c1a368ad1a6008017e2ff", + "examples/fixed_periodic_patch.py": "6732e440a47c237ea341703f2d80717903d34c68fd061bdc97189e5d877be46c", + "examples/fixed_patch_jet.py": "9d58ac3f32478603e8e798efcdaf6ea16e9cc92346eb4780a60e438d331abced", + "research/j3-lag-2026-10-12/host-check.log": "b2b6d262934b3abf9e0f0bdbde14b339cb977f7bffe391c17b51b5d067862dda", + "research/j3-lag-2026-10-12/REVIEW.md": "f388b64b0cc0413dc9865afda90ed24de666dda0d6cdb821b4363ce1b73631b3", + "research/j3-lag-2026-10-12/trajectory.h5": "2b51f8ec5e0cc8ca72c73ac1b51dd611158368e6d6de791d85150fa111ea1986", + "research/j3-lag-2026-10-12/baseline-status.txt": "e0b69879084f54afac1a3bc3701f1de9819068190c815ae84421f02f83cad9f7", + "research/j3-lag-2026-10-12/baseline.json": "5e9a920813fe3d775110af85af92970d5245a7040ace804445e432353b77e489", + "research/j3-lag-2026-10-12/gpu-diagnostic.log": "97956b517072b7c34e2e29e2a23f87eafb19b9eda786a4b8149e4a2eaed76ee9", + "research/j3-lag-2026-10-12/gpu-availability.log": "b227a519b8286849cfdf842573bd451803da048c6b27af9517f6b8964cd3aa39", + "research/j3-lag-2026-10-12/results.json": "00435ac7e402943e55e702fac1beb5af8cafe71967999658bcde2b29077b1fa8", + "research/j3-lag-2026-10-12/incremental.diff": "ebdf66c72daf17b926482f79a1a30bf0eb2d27fc930a7bb62e5449ebcf72fcc7", + "research/j3-lag-2026-10-12/end-21280.h5": "19a94e9e8db6dd9ac981effe06032c351992250b58768d9c090409193893d588", + "research/j3-lag-2026-10-12/start-20760.h5": "6c4cba5928c77566c2afc32231311a3986831c18fea766faadebb101243399e2", + "research/fine_surface_20261014/cpu_surface_projection_command.txt": "b1783e26e92737106a5614fff01452c8ea0364372d9bdbc44c7d15c19d9b13f5", + "research/fine_surface_20261014/cpu_surface_projection_exit.txt": "9a271f2a916b0b6ee6cecb2426f0b3206ef074578be55d9bc94f6f3fe3ab86aa", + "research/fine_surface_20261014/report.txt": "ad8af2be7239f8fe728ac7a8db340d4458e6ec1bbb30b14e614c1072dd9804ec", + "research/fine_surface_20261014/cpu_existing_runs.json": "523b3179b976c2198112c7b49c6c8a75cf7d3332663a8b8a0646c94a39abd1b4", + "research/fine_surface_20261014/gpu_run.json": "8c4b4d7c53e17c30ce4c7d2fb92466e0704f39966e89016dbf82d36cf96e35bf", + "research/fine_surface_20261014/gpu_stdout.txt": "02d1f6fea194d1185a49b7bcdde58642f1d6b9634fe55e4bcda2f020414eb35d", + "research/fine_surface_20261014/cpu_device_guard_cmd.txt": "43a0fb0e20c4adcf1930f145796378294558060d5fd5303402e0538674b68c0a", + "research/fine_surface_20261014/cpu_surface_command.txt": "2b8f2a3c9ddfd1e877efa2a50a935eeb937e2b3ea92515610cd334d80703d6ce", + "research/fine_surface_20261014/baseline.json": "dc9dfa88e69d2b7cf93b0c572961c0bc7849ea1608a0b14b1a6dca1429abf87c", + "research/fine_surface_20261014/cpu_lifecycle_stdout.txt": "af52542989b4a2bf597e020c12064e7083e136f15b938ed5382b616a16f70e38", + "research/fine_surface_20261014/cpu_surface_projection_stdout.txt": "96ea3e4ca948962b6eb92aaf215efb6c598a3c4b296f6fd26094df353ded5722", + "research/fine_surface_20261014/cpu_lifecycle_run.json": "2a3b09ad2f9c86e43892d643a510c9e936d6153e2ae1f6a9eab90c3067f0473d", + "research/fine_surface_20261014/cpu_shared_kernel_stdout.txt": "1ab9905d8b0f34f6d791ff7da4efa2de0f7f3e282a078758cc0496cc0230c0f0", + "research/fine_surface_20261014/manifest.json": "19747021257f2bc5fa012763521a1733c7303a07f319f013253ca2b9ebb3ad35", + "research/fine_surface_20261014/cpu_device_guard_stdout.txt": "f4c61c0ac8f55c6c9a2d6c593731bf5f8c4a6c5bebbe514284fd4f899818f9e0", + "research/fine_surface_20261014/gpu_test_run1.py": "3dd0658f63a4e7a1c41eecf433842c872f8fecb391ea4b44d0b48947643d5189", + "research/fine_surface_20261014/gpu_preparation_run1.py": "b3fe9e58118369adb1bdfc618fbfbd917d508a563beaf2555f656b59aeff4425", + "research/fine_surface_20261014/cpu_surface_exit.txt": "9a271f2a916b0b6ee6cecb2426f0b3206ef074578be55d9bc94f6f3fe3ab86aa", + "research/fine_surface_20261014/cpu_surface_stdout.txt": "bdb786f2d289eaeab4e53d0fdccb998525c217efaa778496cf7a97ccca9e1597", + "research/fine_surface_20261014/cpu_preallocation_run.json": "363106050ba00d9a1c5c948c36926e8510ed7fdd75d28cfeca59f593fd0f1c50", + "research/fine_surface_20261014/cpu_final_stdout.txt": "bdb786f2d289eaeab4e53d0fdccb998525c217efaa778496cf7a97ccca9e1597", + "research/fine_surface_20261014/cpu_maps_stdout.txt": "7886fd4e2fa8a63e9cecf02bdf650e5447ba149704ac75f51da6964d8e77ba6b", + "research/fine_surface_20261014/cpu_device_guard_exit.txt": "9a271f2a916b0b6ee6cecb2426f0b3206ef074578be55d9bc94f6f3fe3ab86aa", + "research/fine_surface_20261014/cpu_preallocation_stdout.txt": "59907462a8d5fd93406cdf4c7d1eb2f7b7a96664ae85c4ec202693d419cd019e", + "research/fine_surface_20261014/incremental.diff": "9cf8b5cc4ea037c865762ba7069f0c1daabcb4383d4333167d279f8b7704e5b0", + "research/fine_surface_20261014/cpu_final_run.json": "020a9ef12904c2d18185613d68a58dd7ff9b1b22197ac1f95bba61f2f593eaac", + "research/refinement_slot_20261013/incremental.patch": "2daca4c9751190df27e18ea79e46685a8fe3cbb6d42b34135b1219b8f53ea3fc", + "research/refinement_slot_20261013/baseline.json": "17b1a8cb7e8232979cd1fc9976cb6b78aa58a7005449526ec15cc0bfd45f8139", + "research/refinement_slot_20261013/manifest.json": "9f28f275533e8a1a761ec748152170b40845612058236ce331c47ae6c5d68713", + "research/refinement_slot_20261013/before.json": "482b02da26207ce32deb9368b6eb63f9de7b4ab670078c02f458f512fb182b53", + "research/refinement_slot_20261013/notes.txt": "8c70efe2acef9f179c453d297b27047b7632a2d55e0739fff4bccf74e0867511", + "research/refinement_slot_20261013/stdout.txt": "1cabbc8a87a2a237ffa649feac0b1b8e0ae8d769af8c298e600e249d2a525f58", + "research/refinement_slot_20261013/results.json": "6245de38106d7a7b0bfea0aa5100b9c9e393ab5436fc594ce0295b4526964b8f", + "research/refinement_slot_20261013/cpu_results.json": "2a891c1adcb3b25390ee7967e5171396aedb9cb4da5ae85f7444450d758671d5", + "research/refinement_slot_followup_20261013/planar_velocity.sha256": "326639a3e66b2b8dbd21ecd76b32a331f3194a82d1b5888219eee4a1782f6366", + "research/refinement_slot_followup_20261013/incremental.patch": "b734b4b540ece11a037a0f119a9846c39c09c8247d3cc89877880a27c3d082c4", + "research/refinement_slot_followup_20261013/planar_velocity.cuh": "0b2f9e0bd483c199637e5672dc0ffc460bc383dd1804805befbeb4c5d8c708d1", + "research/refinement_slot_followup_20261013/baseline.json": "7ee505b7371a5258db7cb197c999be8859d14641915e3085f1969deb465880a4", + "research/refinement_slot_followup_20261013/manifest.json": "b11c1fb42abccc4b5638b974d1ea00b0687d8fad72b492eab3c8435bf485fd13", + "research/refinement_slot_followup_20261013/before.json": "809c4a6f330d4a29e92415fd0eb820f34dec38484e3560a8b9287b09553c2d87", + "research/refinement_slot_followup_20261013/notes.txt": "c04644a287aa936c9c6de0ca9d8bd83cee2d80aab9544ca284c9f7c029bfeff9", + "research/refinement_slot_followup_20261013/stdout.txt": "acb72f2b14e1abfe750330d84a38afe9bbe944bf028dde9700a291d5edff4be4", + "research/refinement_slot_followup_20261013/results.json": "dc38c3f5f88fac2ebf49be11df84e9f3da9d25504d400b6a506240a91735e4e1", + "research/refinement_prepare_20261013/incremental.patch": "df01345b8e2c33ebf6cdcbbb5104f02c4d7c239a6e6cafab1833228791bfa9a7", + "research/refinement_prepare_20261013/baseline.json": "5cc3c35faac9bb43a0017d83ddfca330d7da93f1e6407391da56b2e9df3b28b6", + "research/refinement_prepare_20261013/manifest.json": "5d479557cd01d61d8b652a3cf456fa57665bf624ce3b4a42c747523b74dec548", + "research/refinement_prepare_20261013/README.txt": "eee46f01add6ed7a5da76da76c98da628e13b930cfc49785399d7afbedbfd95f", + "research/refinement_prepare_20261013/validation.json": "945f4c3604ae0eae91c29741a39588207cfff3e05646e03a12d074a299956c2f", + "research/refinement_prepare_20261013/validation.txt": "5b5a8e9d455d37064c6709dcfd14e89ba66f51f09a11a9863b5cab67ac651d42", + "research/refinement_followup_20261013/gpu_rectangle_before.json": "aeab9314117b7eaa0950566094d20ecb5a304cc55b85887b6281694d3a6b8660", + "research/refinement_followup_20261013/gpu_before.json": "236cc69740cb40640cf4cd96cd94ff80644c2cf07c471b276092303edd3003e1", + "research/refinement_followup_20261013/gpu_rectangle_before_no_launch_1791886104981638567.json": "831b08511b78e8e631a17a638212b1c511e6f3fdb86019d7a77cc0f44d4015d2", + "research/refinement_followup_20261013/gpu_stdout.txt": "3147d3ab0b58ac9aa67c495491979ebb455db0fc2e89e7004facbd8c55c67b4e", + "research/refinement_followup_20261013/cpu_results_attempt1.json": "a91976e3ff92f7fe458a4432dae31d6b751bee92450d9a07e1dd5ee1cf5e915a", + "research/refinement_followup_20261013/incremental.patch": "b638544a02cbf7dd7acfcad545fcac50dc9640e193a9672f27916275c134253f", + "research/refinement_followup_20261013/baseline.json": "77694a29bbea2e61eb69eb5fe37eca7a8d5e82114bd59c7ff23e89d3db53a019", + "research/refinement_followup_20261013/gpu_seed1_before.json": "4dc6de02770a8e985f62d902ab9067cf5910084e4506ece059979640adb5575f", + "research/refinement_followup_20261013/gpu_seed1_stdout.txt": "8453a1b7221085691b39439428e39aaf52215abbbe9b1f84fc54c4a695260a9e", + "research/refinement_followup_20261013/cleanup.json": "ce1fb34fcbf2fadf7786234a8dd5dd9d0e520d9353a08b5df4c6777a35beed88", + "research/refinement_followup_20261013/manifest.json": "5f4c3b56a9ff8dfb422c37e0777af90536e94585ae7573caa05410e3cea294f5", + "research/refinement_followup_20261013/README.txt": "c553e889c6d66bb81d17d2691150cadf6fecdaa336de941281e7c85a6ff1eb12", + "research/refinement_followup_20261013/cpu_stdout.txt": "f9bcee3a2b43599e99c2e3b3a250aa4d4f4db1a73d1bf7cf1db0ab1fa585c54b", + "research/refinement_followup_20261013/gpu_before_no_launch.json": "396664d587d2e7791e972def03c7199845f7a162ab4626733fae1e54e1262da5", + "research/refinement_followup_20261013/gpu_rectangle_results.json": "9a06af9ec07de80d049889f321b7ea5f03036f4e461af2a43cdfb76d02ee1d6a", + "research/refinement_followup_20261013/gpu_rectangle_stdout.txt": "fea29f48685d84966b51d41b33e59bc01bef7d9dbc5e75b3d7c316de761f5bd5", + "research/refinement_followup_20261013/gpu_seed1_results.json": "ac54f5071b6e6095437078d4f8ed1cbc851a4b727ce6336281c1f27472f3dbe4", + "research/refinement_followup_20261013/run_gpu.py": "16b1520adbfee1651539f04dd694f5f02e9dc8ae4f4fc55d374a0ac06b50b4b8", + "research/refinement_followup_20261013/cpu_results.json": "a1a57b35c0839a82a7b653a062e852edf693d2c318da77dc1cb79373661bc780", + "research/refinement_followup_20261013/gpu_results.json": "be369bb072139b3fbfac4cbb3ab5eade7d2fb1ab67549ae2e4e0d0f48f640dfc", + "research/refinement_followup_20261013/cpu_stdout_attempt1.txt": "6ac5f889a9f6b6ecfa8abb74e98b07deaadc71c7f5488112eca26e4ed255e7ba", + "research/refinement_step_20261013/gpu_failure_validation.txt": "d6ec00e0e8c69015565135a67fac6de47701e9eebc3cbacc379abf8166ac61be", + "research/refinement_step_20261013/cpu_validation.json": "cf7200fc4b763f5a2133d8affeea306578a247179bb82ce2f5ae0d8e244c576b", + "research/refinement_step_20261013/incremental.patch": "c3d2d813b64f8a2305f54153508d71b546d86af7be1005cff96e0ef8c91297bb", + "research/refinement_step_20261013/baseline.json": "68bd37982acb433bea235a94f211c907be483e905742f98166235929f79ba95d", + "research/refinement_step_20261013/manifest.json": "a60a40ffa9073a8047f3b9f5af3c1256179603641083c3a20dda6cfa6e050146", + "research/refinement_step_20261013/README.txt": "922d6fc6c742203f69e174a12cac6b19e8ae15be74257134c08d72990b16d517", + "research/refinement_step_20261013/gpu_validation.json": "2f0218854a2a307dd15a891a781fa3c2b7e865c201630a36ca180134b1ee6436", + "research/refinement_step_20261013/gpu_validation.txt": "1714ee85e6235528bf29dac85bca1298a673bdb9bf0c9c364961bf364a83f0d2", + "research/refinement_step_20261013/gpu_failure_validation.json": "5e7d58863659af3c29f10aac11ff43516fedd39a30a40e5ead62732ba80fcbd3", + "research/repair-2026-10-10/simplification-checks.log": "c9f15e870d02003480adf1a7f2fe4a9aca66c1934c4477619f05c8a4798ba85b", + "research/repair-2026-10-10/repair-state.md": "4d4aa1ec0c11a87d2c8380912e7ed74cf5c910ae42e5cc529effde36c9020969", + "research/repair-2026-10-10/TRON_HANDOFF.md": "f8aaa3d99cd133c2055d4adf396a0a57d14f6006aea19e87611bd1c2c1b53a88", + "research/repair-2026-10-10/final-gpu.log": "988bb97256d17b88c14f3793b15880d727ecb285abe62e7d2ae27a16729651c3", + "research/repair-2026-10-10/baseline-status.txt": "074088d793014e3b8154c58718058c7d300fb45595f5129fa957ef1e4cec38e2", + "research/repair-2026-10-10/repair-architecture.md": "49be42ff5c994017f3175e17efda14d84f0b68f8ecd239f66ccee38415b60c5a", + "research/repair-2026-10-10/classic-results.json": "a5d15305f516fd378b54cf9029102be58a83a55a7bad4b8e058fcfe0cc9898f4", + "research/repair-2026-10-10/checkpoint-domain-2026-10-12.diff": "292b4bafe7a62d4fbbf7c165eb99929336edfcaa16b15f34f72ab71fcd928391", + "research/repair-2026-10-10/repair-numerical.md": "0272ebfa8c519aad161c520542cf53156574661609b91fd5ccad7955fdf2bd7b", + "research/repair-2026-10-10/provenance.json": "a81b7e32ecf7182c9617df1b39bbb063a05ef89290ad501bac4573cd5e8a6832", + "research/repair-2026-10-10/classic-signals.npz": "820c9a0b0713d7455f0a5839ac2cd5ee706086d1a26461225dcdb095673421e2", + "research/repair-2026-10-10/baseline-hashes.json": "d6a7d5f9ec5bceb0e7927d55603d9c5e70105982cd945723454659b19ab476e6", + "research/repair-2026-10-10/final-unit.log": "a892a39ecf88125558538cadce2cb5dc46d106b993b164e03da4ebb0eee68cef", + "research/repair-2026-10-10/original-user-files/tests/postproc/experiment.ipynb": "c6b45db1c57200f0777213ef8d44cb4996c1aa7a5fb42b968b77e56f51b4fca4", + "research/repair-2026-10-10/original-user-files/src/CelerisLab/lbm/kernels/config/config_physics.h": "26df33c2960ba36f3283e19b55b4ea92e50e4efda705f9ebfbf3f875a4092c59", + "research/repair-2026-10-10/original-user-files/src/CelerisLab/lbm/kernels/config/config_method.h": "3db4e16ef2c6b22349d04e6aa8ab04bdfe0eb784f9f3a98277e15dbed1835d81", + "research/repair-2026-10-10/original-user-files/src/CelerisLab/lbm/kernels/config/config_grid.h": "8be3a7cf74ba30d7fd3074fed79e63dbda7311c4d03b454ea641bf298ffeaa8d", + "research/repair-2026-10-10/original-user-files/src/CelerisLab/lbm/kernels/config/config_objects.h": "dbb93c063586da278c15d95e23f84c12e728f4f5f1bbc3980fe9cedaa6fff90e", + "research/surface_actuation_20261014/report.txt": "128dd731124542be4ba50fe18d24ceb0a5b37f0329bcf32cdda4de3f1514b0c7", + "research/surface_actuation_20261014/gpu_run.json": "e06268a9acdb3c6ced30e58d684c427aeaaa427b7098da55e60f9a4854a8aa58", + "research/surface_actuation_20261014/gpu_stdout.txt": "bc882fe06353f12ab2b85bc5c9b7e6a23adf705d9e2ab6a529ca8afa49a5166a", + "research/surface_actuation_20261014/cpu_surface_command.txt": "7204f2326b37ce0b4bf05e806935974fb91246922f7e3760dbab0627d94f07ef", + "research/surface_actuation_20261014/baseline.json": "4456d6718db2ad3335c372368e3e1a0a384d78319855a0a9d4cdfca02f28a4c7", + "research/surface_actuation_20261014/cpu_initial.txt": "2c19cce736bac1da5ccacf06b0c71b0e1affcd385e1346d2ab9a0cab5567842a", + "research/surface_actuation_20261014/manifest.json": "9a4e768bd10e8609cd722af8f3904aed27df7debaf2389aa20692c67fe05050f", + "research/surface_actuation_20261014/cpu_surface_exit.txt": "9a271f2a916b0b6ee6cecb2426f0b3206ef074578be55d9bc94f6f3fe3ab86aa", + "research/surface_actuation_20261014/cpu_surface_stdout.txt": "8e47fbdb3f81736adfbb0df2621df4953cf20f2e49cf63a9518b32e6a524fc20", + "research/surface_actuation_20261014/incremental.diff": "9511a0f105edd655f08fbbb22b0330729ee6b610b15febfa38403c4ec506c88b", + "research/surface_actuation_20261014/cpu_checkpoint_stdout.txt": "d740f1038fb46c8c49a0677d9b0d3677ef461bc14cf58f92eb8bd9ad3b1c97f9", + "research/surface_actuation_20261014/cpu_checkpoint_run.json": "8970cd51e65172d47ed3dd16fd118923708dbb2309b213fb819a4c9e3f2e67d0", + "research/j1-2026-10-12/REVIEW.md": "13004a4f140acdcf59acb57e9e2dda1bb95763d30060f822a7c206c94b813a9f", + "research/j1-2026-10-12/gpu.log": "8659a78ea52bbf8eb923d46ea71636ce63cd322352d5c98a74f631e666dd8cfb", + "research/j1-2026-10-12/baseline-status.txt": "ac398360e05b746b89ae0c3acfe202b5122e650a3bb1ff234ab26f874a303e64", + "research/j1-2026-10-12/baseline.json": "ad7afdf7b3913d11c07343e971fe2f43c2d1a2b99e3d5904a6ba89e3bb0b24fb", + "research/j1-2026-10-12/checkpoint-gpu.log": "adfe3d77d2e6c6f6184dccc0267b4404b20a7709505d5ff5affed0ed4a618083", + "research/j1-2026-10-12/cpu.log": "60cac097f7c4f11401df2aacb43a248640555e7628d2829c4680c71db34e9640", + "research/j1-2026-10-12/gpu-validation.log": "d1e9f2aea17a85eddcd94b81c700738ce073214857b55c28abd1219ff1edbed7", + "research/j1-2026-10-12/results.json": "449f8a17dacac0fc6d2489c4b10bac330dbbbdb38fad3ce54f739ac8c6d48e85", + "research/j1-2026-10-12/incremental.diff": "a454c23da7b0011645949c0fbf64d0c41ecfdab5642b1b7c5119868005d3c721", + "research/j3-coverage-2026-10-12/restart-21280.h5": "3e89c12c16f91f76ca9acd909e0fa7d42df6fbb5e870b299aa08ca42bc3e3dc9", + "research/j3-coverage-2026-10-12/REVIEW.md": "7293f3f3442855c8521698605aab504e026915a7bf1e77f5a24710d89a812443", + "research/j3-coverage-2026-10-12/restart-reference-21296.h5": "7192f510dd7820675aa1de130f55514136fba782cf77f92545189918a7e0c328", + "research/j3-coverage-2026-10-12/negative-end-20760.h5": "bd0bd063579d625e358762b1fdde5ac11bfcf739646a847fb77a4a2031011b9b", + "research/j3-coverage-2026-10-12/baseline-status.txt": "31c949b11b20d7cd4202dba16882b5712aa1653da0cb2da2f0ebd69bf488040e", + "research/j3-coverage-2026-10-12/baseline.json": "d8844104f2665a25bfc417ee29becf89ab3955fac9105b5ddb12cfb1fe2a55b0", + "research/j3-coverage-2026-10-12/verification.json": "205986efd2b41635721b7fd20288be982348c765180102c7102750ba088f3a28", + "research/j3-coverage-2026-10-12/negative-budget-20744.h5": "c09d75fc4a2cff68039a0956bd9d32b79b9cd3a6b386c72b4db54c214b110cd8", + "research/j3-coverage-2026-10-12/gpu-validation.log": "505cd5a5db46d7984aefb2a614151c25c4ace0e7d2a52e02c3e4f9792fd8eb95", + "research/j3-coverage-2026-10-12/results.json": "02460981ad49c9cc13b4246abad1d8afd2599c61bfb545a6e32da9bbcd5c0db1", + "research/j3-coverage-2026-10-12/incremental.diff": "98aa7855d5d6b91b4509a924c8a5aabab4339ba29c7e7dc2d91262c48e3848ca", + "research/fixed_patch_jet_20261013/incremental.patch": "dd95a98f03b7ce06d024a1d1d1f454dd206ad10a573a8060f728bad71941d6e8", + "research/fixed_patch_jet_20261013/baseline.json": "d2a83d490ca545589a7a7fc0e3fd187f4801e22e5c8d2d18ddb519097d3281b9", + "research/fixed_patch_jet_20261013/manifest.json": "3efaf5af8d6a4f6c3460d8023466af611ff90bc9fc79c3e7db6f591d172d1182", + "research/fixed_patch_jet_20261013/before.json": "dd47f1e25a807a3eafef7d12429f034117f945a4ebfeb98eb1688d1752c3d30d", + "research/fixed_patch_jet_20261013/notes.txt": "155be36e201c9c8a043a87fc7a7d0064b703990b2aad86853767603fe38a256d", + "research/fixed_patch_jet_20261013/stdout.txt": "925abb3038095560d71a4e7733b38d93672397640cc88197c733a8a39e2f9f51", + "research/fixed_patch_jet_20261013/results.json": "fcd944b8dec61b399874b5386d6e00880f0dbc34d248ad371a6af8781fddaa93", + "research/fixed_patch_jet_20261013/fixed_patch_jet.py": "f27cd067fd7b9a7c6d7fab19fa471fe0617ee67889ae3931048557cc5659181b", + "research/fixed_patch_jet_20261013/output/summary.json": "a9a4ab5975684a386f05746f570ec4d7b1c5ee3be413400445122448f534eca3", + "research/fixed_patch_jet_20261013/output/velocity.png": "0f8ffc3a7b36ffefa5c0cd8550309fe89d9de72cd5476f354a27fac89cb39b0a", + "research/fixed_patch_jet_20261013/output/layout.png": "cfc354c0192a5a9727a8056ff6c5bc4571f916143853e4da2dc16da965e10173", + "research/audit-2026-10-09/numerical_semantics_results.json": "b95b065b594aa2911740dab216f87936c9bf7f7fa25acfda93b5738443564035", + "research/audit-2026-10-09/REVIEW.zh-CN.md": "2841fd3aa7a6baedbe1079d90915c8b05212b133824ed6abccaa1f09656eaefe", + "research/audit-2026-10-09/root-initializers-report.md": "ca448457c444949d5d0e1e10fa7121064510b77fc4c3512580900f0299219867", + "research/audit-2026-10-09/numerical-report.md": "970330b3a593f79f09866ce6ae82bc0ddd81226230d0a6ff06ae8ae756ee80da" +} diff --git a/research/fine_surface_joint_20261014/baseline_03.json b/research/fine_surface_joint_20261014/baseline_03.json new file mode 100644 index 0000000..da99b45 --- /dev/null +++ b/research/fine_surface_joint_20261014/baseline_03.json @@ -0,0 +1,72 @@ +{ + "research/audit-2026-10-09/numerical_collision_results.json": "51e5c263bb8cde82cedef2ccfdbf5ef657742a80218d7896b1ff877516e59693", + "research/audit-2026-10-09/architecture-cpu-results.json": "e1b809210005c8765b13fddbb5ed710d15f6fcbb4c5788a4064f3e88808433ef", + "research/audit-2026-10-09/numerical_compile_results.json": "c3b0ae02072a2ec408ada7513b542ec255f6855cb743a3ed7f91bd8f31504f44", + "research/audit-2026-10-09/state_results.json": "da9170df3e11231c73f20e5e79ed68e08966673d1dd52004ea6b6a279afc0dcd", + "research/audit-2026-10-09/architecture-report.md": "861079dc3f4ced9fdc41bfb22002d32e190c0d630d3ba2f138f9dc7a949b8371", + "research/audit-2026-10-09/state-report.md": "f8708807efc2e109810c5955f7c1884a932668c0b3cb2963c2df3b09f2a3d5c4", + "research/fixed_patch_jet_closure_20261013/incremental.patch": "18b30ecc0703bcb4cb6577255d12a5b0d95dfea99d02d761bbc1b5b231bba1d3", + "research/fixed_patch_jet_closure_20261013/baseline.json": "ccf88409836657aebbf091f06c41141c81d20169c2cac0fd8e2a16b40df36882", + "research/fixed_patch_jet_closure_20261013/manifest.json": "7a2a079be7b6146b3bc2f5494f98ca2f935805ca4c6aa1eb1b9067fdeb3ae3c5", + "research/fixed_patch_jet_closure_20261013/notes.txt": "bc3c939659ef0cbda506024d79b896707f4dc4af94bb088924e139f81a9e885f", + "research/fixed_patch_jet_closure_20261013/cpu_stdout.txt": "4e1f371a568eb1c2a7912cb5ea564c8c23f0106dbc41a68f179bbcafdff2cdff", + "research/fixed_patch_jet_closure_20261013/layout_uncropped.png": "0ef6709c02ed5beba5707e033d9f6f9795a9bbfe3d7fc23341fa7dab6e85288c", + "research/fixed_patch_jet_closure_20261013/cpu_results.json": "6bae91721db9051f18bbf89dacca40b80410f84f037e7732cb1af4eadc24aaf8", + "research/j3-offline-2026-10-12/REVIEW.md": "d9902c58498e73c29e054b23adb968f7e1e14421cba5c58d03bbc5a50159ae79", + "research/j3-offline-2026-10-12/lags.csv": "fbd9addd413f24c47f4411317e872265bb774e8e1724fe169412befa860ae94d", + "research/j3-offline-2026-10-12/localization.png": "a72907638e32b0ecfc2205bea438e7b408f40aad86217ce6ad9b4877840c9cfc", + "research/j3-offline-2026-10-12/results.json": "cdb857bea6f4e06ed15acf773505ce6d5147f8cb8ce0a53cc368ee267cde6361", + "research/j3-offline-2026-10-12/cpu-analysis.log": "bc02a9b197fc15ae1b503ca54655a7622d4361f9b45b7848ff9c387ea3665f11", + "research/j3-offline-2026-10-12/regions.csv": "3a8fc640b61d70e3b7f73d2bf8ac2bd3f720adf39a90dfda6180430e0489efae", + "research/fixed_patch_jet_records_20261013/incremental.patch": "63485fb4eee8e2e89b683961aee32a6ca00ef5e607a362efb3290f3a08809222", + "research/fixed_patch_jet_records_20261013/baseline.json": "d73ddb2a6629f03655aa05fae08bb4bbc9474c686af56dbe29c99d6491b7508e", + "research/fixed_patch_jet_records_20261013/manifest.json": "97a2fbf139985a19cb6c0e0818646571fa1bcfb23e36424998a64777db641592", + "research/fixed_patch_jet_records_20261013/before.json": "68ec7ef820d5f826b6e24c6afdef71c76bd22400393815321ac3a1905c437796", + "research/fixed_patch_jet_records_20261013/notes.txt": "6d55a6395833fa02883357752ab3d8ea43df516fbcb40e4006fb1756757b1e99", + "research/fixed_patch_jet_records_20261013/stdout.txt": "6e579eff0c1762ba31d8b1cee709e0cdba2e3f408432b71fe374b2d9f450665c", + "research/fixed_patch_jet_records_20261013/results.json": "7997ee1626ad0640a9d362499c8e0eeefe9d71913fef5f2280112d5bdc9b50d4", + "research/fixed_patch_jet_records_20261013/fixed_patch_jet.py": "7d6370fe6d8b723b1b3e1492e89fcc72562383c0dc030c25a254ac3fc899845a", + "research/fixed_patch_jet_records_20261013/output/summary.json": "a448c2e66a56ee48071315d6f73d0ec1afccc29d680ab3a40d51d1df62dd973a", + "research/fixed_patch_jet_records_20261013/output/velocity.png": "7c67c5f64a4bec94547c0ac7833e6d47eeaae9696904c1465a9d5d969008b79d", + "research/fixed_patch_jet_records_20261013/output/layout.png": "678ba19a51c112960ace2a4b8d9d94e43287d97c3a6ef892684630ab37b70255", + "research/j2-slot-2026-10-12/REVIEW.md": "10c4a94ffc32e0a2c4e0f6593b7cfc28479b5869f279f0b9d0b708fa3a47d1e6", + "research/j2-slot-2026-10-12/gpu-serialization-failure.log": "df804e53b35e7ddaad79a17842b4b5fd9d834e29ca2d56edb00e835848d09200", + "research/j2-slot-2026-10-12/baseline-status.txt": "812616e2d941efcf854e1b37d6e662dda1aaf2b69074fcc04017133e13b72166", + "research/j2-slot-2026-10-12/baseline.json": "e82a1844145fd0cbc585c581b29f80b56193f122cfe1dfa7578f26904a720285", + "research/j2-slot-2026-10-12/cli.log": "9482ad7101d501f27f92e204b2f3ae5c6d91bd887b525aa31cb4a2a188f3cb92", + "research/j2-slot-2026-10-12/cpu.log": "91aba5961006909fbbb860429a9d3cfc930112a0d74c7788bc51c0a5897b47e5", + "research/j2-slot-2026-10-12/gpu-validation.log": "223351b52c70fa4523289f3a1b3db435a11286379253280470900ffe397580a6", + "research/j2-slot-2026-10-12/results.json": "7d35ca7989aed5380e0a45de7f583972566fc516a051da63c53b35514e267494", + "research/j2-slot-2026-10-12/incremental.diff": "c9e391bc91438cd912c1ed5a419705d4388522f672c67a066cfc055e814e699f", + "research/design-2026-10-09/math-and-history.md": "64f8c82e4949d6f58b46faa09800958714859c36cad20bbeeae8b449ae7a6099", + "research/design-2026-10-09/math-checks.json": "94750381954317cde8d649db26beaed8ea945666572a05030ca2b4d97d384011", + "research/design-2026-10-09/Contracts.lean": "2442d9a778ef20e8af3fecf23be6fea6d73c6299ff744c9664b652bc5ee3f034", + "research/design-2026-10-09/jet-study.md": "a362142ef04a5ad5dbb4c9db9d221b1199dccec53780c8f2da49a15201cfe529", + "research/design-2026-10-09/PLAN.zh-CN.md": "0341dd7ee306a040340c8e5dedb07a109e931c27dbf3c994d072aa78e3b6bc67", + "research/design-2026-10-09/jet_closure_results.json": "12cf7d400a206f9f9ec9ea6ad251fe6bb0232e27bcbed22fbc1ead2c0fc7d249", + "research/design-2026-10-09/grid-study.md": "4435dc1275ec5e15b118becc6ac391f306195d1e5beaa58037b1aff3bb2465c7", + "research/design-2026-10-09/jet_closure_check.py": "fde45d0f8518740ef5c0bf0fe7635d6adaf9a2e789927dd4e68e991c138ddc30", + "research/design-2026-10-09/api-architecture-study.md": "d6fb45ec784f0e1db55fb9f34e137b9f551db0b9b39fd4f0ef247a78fc34eedf", + "research/design-2026-10-09/math_checks.py": "4254983a783fe4bad8888b3d7c243c87d991c7bbf242edb0f56f25cbaefee890", + "research/wall_seam_pulse_20261014/analyze.py": "2b174826ffaee96c147bd247ef5e322cb51d55ce506f330bac021afd012560f7", + "research/wall_seam_pulse_20261014/stdout.txt": "4a555ab2412d6b6974ba42f213fa394c6b438a3762981a135cbddfeff5598ae2", + "research/wall_seam_pulse_20261014/run.json": "4466aafbea16f9af46d70a5da4c8ce69ea7d5fcd256181f083cc728d1c35bfe9", + "research/wall_seam_pulse_20261014/interpretation.txt": "9785c6814a25cddbf5e74b4cb1ba421287c920d97a502425d6739667185a24c6", + "research/wall_seam_pulse_20261014/results.json": "29b7588e4cc86750d63567315fd430c9de20be5419bb45f8bca4a5259f6473aa", + "research/wall_seam_pulse_20261014/sources.csv": "765f6e8b7545304675688295153ee6c94deacfbfb52571c831021ca03f4bb98d", + "research/refinement_example_20261013/incremental.patch": "6acd05df6669ccdcf234ac1680c6e76c75a2587974adb6728f7edda6fd625b69", + "research/refinement_example_20261013/baseline.json": "ae0af15ddb40709d1e348655a665264984a240ded1e28af816a8000d08e784be", + "research/refinement_example_20261013/manifest.json": "6da85ac513065dcf49200bc0872bec38b6c7ba61f7d82036c2189cabe5ac29ce", + "research/refinement_example_20261013/before.json": "d95cd518f080eab92af5e53e1e9b6b6fad626eae51990e510d2d2f2ae9d0ec7b", + "research/refinement_example_20261013/notes.txt": "f111f8cba94b43d1127945fa41615037e1740efcfc529e802338dd8c4ff02795", + "research/refinement_example_20261013/stdout.txt": "9c59fb315a5552cce4ceab171003e425bf64d747137c89bd86d8779a34adcbd1", + "research/refinement_example_20261013/results.json": "8ab13bbc022f2a66898aa07ed94f43cb6716570e7a360a809b7fcd097316db7e", + "research/j3-reservoir-2026-10-12/gpu-availability-sandbox.log": "1d58470512e583a0acfabf6896ee5f31e5b493b8231aed54b864f64eb275b02c", + "research/j3-reservoir-2026-10-12/REVIEW.md": "1ea5f860728584ea6cbe40ba3994e40471102d8e2cf6d93e28fe47222cba0cab", + "research/j3-reservoir-2026-10-12/baseline-status.txt": "0ef1a8c9878c4053ebc1a7d4bace6d4ec38bf27ace167b4239ddbb1c6c897e20", + "research/j3-reservoir-2026-10-12/baseline.json": "847fefd1eae971985d34d04d89ee6d6f1c91f6940c54fe351d112faba7bc6838", + "research/j3-reservoir-2026-10-12/cpu.log": "b33f6c1a1b0ee67968c4cff85d491e46e30e0d6c796b552629714ab8b5dcead0", + "research/j3-reservoir-2026-10-12/gpu-validation.log": "ff04024db197e332f37c912a96413e3251fd0186947348ffbc33af6f4a899f2c", + "research/j3-reservoir-2026-10-12/results.json": "49685de7679a14860258abf1753aaa6d116ad709b868d907ddb40e74c9b845ea", + "research/j3-reservoir-2026-10-12/incremental.diff": "fae312831d71e46dd477a640b06ed927853a9e735d26bf9f5868927fa31cfa56" +} diff --git a/research/fine_surface_joint_20261014/blow_boundary.csv b/research/fine_surface_joint_20261014/blow_boundary.csv new file mode 100644 index 0000000..e13363b --- /dev/null +++ b/research/fine_surface_joint_20261014/blow_boundary.csv @@ -0,0 +1,49 @@ +step,substep,time,bfl_error,drive_mass,latest_body_impulse_x,latest_body_impulse_y,latest_body_angular_impulse,boundary_m,boundary_px,boundary_py,fine_transfer_m,fine_transfer_px,fine_transfer_py +1,1,0.5,3.7331066016221826e-09,0.0015482567250728607,-0.0010669911280274391,-0.0009111231192946434,-1.3296011179275702e-05,0.0015482567250728607,0.0010669846087694168,0.0009111212566494942,0.0,0.0,0.0 +1,2,1.0,7.450580596923828e-09,0.00155003224242226,-0.0005924226716160774,-0.0005089053884148598,-6.828160713734377e-06,0.0018995041027665138,0.0005924198776483536,0.0005089100450277328,-3.557652235031128e-07,0.0,0.0 +2,1,1.5,9.730734440438482e-09,0.0015509553987416245,-0.0007510213181376457,-0.0006337100639939308,-6.453869729639017e-06,0.0018004681915044785,0.0007510194554924965,0.0006337091326713562,-8.530914783477783e-07,-7.450580596923828e-09,-1.6763806343078613e-07 +2,2,2.0,7.450580596923828e-09,0.0015510943465718227,-0.0007005799561738968,-0.0005853474140167236,9.16537625561542e-06,0.0019320533610880375,0.0007005711086094379,0.0005853441543877125,-1.3401731848716736e-06,2.7939677238464355e-09,-9.313225746154785e-10 +3,1,2.5,8.252825436927402e-09,0.0015511169589478664,-0.0007204441353678703,-0.0006065750494599342,-1.9204094044988906e-06,0.0019155647605657578,0.0007204404100775719,0.0006065657362341881,-1.6577541828155518e-06,1.5832483768463135e-07,1.5832483768463135e-07 +3,2,3.0,9.915552157124807e-09,0.0015509250112041078,-0.0006797974929213524,-0.0005730642005801201,2.2820092603348385e-06,0.0019676131196320057,0.0006797960959374905,0.0005730544216930866,-1.982320100069046e-06,3.1152740120887756e-07,3.096647560596466e-07 +4,1,3.5,9.13659503609665e-09,0.0015507420136590903,-0.0006570117548108101,-0.0005553392693400383,-3.1137037854733762e-06,0.00195569870993495,0.0006570047698915005,0.0005553369410336018,-3.2121315598487854e-06,3.5297125577926636e-07,3.762543201446533e-07 +4,2,4.0,7.450580596923828e-09,0.0015504969629409936,-0.0006134528666734695,-0.0005185604095458984,-2.5563305094955524e-07,0.001978149637579918,0.0006134519353508949,0.0005185585469007492,-3.698747605085373e-06,-3.585591912269592e-08,1.909211277961731e-08 +5,1,4.5,7.450580596923828e-09,0.0015502991826538432,-0.0005827639251947403,-0.0004925131797790527,-2.496779667127136e-06,0.001968016382306814,0.0005827643908560276,0.0004925071261823177,-3.6563724279403687e-06,5.550682544708252e-07,2.4121254682540894e-07 +5,2,5.0,7.450580596923828e-09,0.0015500768212474217,-0.0005441568791866302,-0.00045982934534549713,-6.621178455512577e-07,0.0019786693155765533,0.0005441587418317795,0.00045982934534549713,-3.6312267184257507e-06,5.122274160385132e-07,2.2258609533309937e-07 +6,1,5.5,7.450580596923828e-09,0.001549918623869907,-0.0005141962319612503,-0.00043411366641521454,-1.9021591811663185e-06,0.0019702534191310406,0.000514195766299963,0.00043410947546362877,-2.8940849006175995e-06,5.164183676242828e-07,3.213062882423401e-08 +6,2,6.0,7.450580596923828e-09,0.0015497499199425297,-0.0004802681505680084,-0.0004054997116327286,-7.309877421146638e-07,0.0019760499708354473,0.0004802667535841465,0.00040551135316491127,-3.33273783326149e-06,-3.0687078833580017e-07,-2.1746382117271423e-07 +7,1,6.5,6.764444948625936e-09,0.0015496176481223653,-0.0004520462825894356,-0.0003813067451119423,-1.5892076227208562e-06,0.001969610806554556,0.00045204488560557365,0.00038131000474095345,-7.304362952709198e-06,-2.8349459171295166e-06,-1.5050172805786133e-06 +7,2,7.0,8.109305865700023e-09,0.0015494958415757888,-0.00042206887155771255,-0.0003560921177268028,-7.75549964804334e-07,0.0019731801003217697,0.0004220716655254364,0.00035608746111392975,-1.9578728824853897e-05,-1.0931398719549179e-05,-6.151851266622543e-06 +8,1,7.5,7.94549828708746e-09,0.0015493981799709084,-0.00039640720933675766,-0.000333922915160656,-1.3677983846660524e-06,0.001968265976756811,0.00039641233161091805,0.0003339252434670925,-5.536805838346481e-05,-2.580694854259491e-05,-1.5653669834136963e-05 +8,2,8.0,8.57936799381065e-09,0.0015493020071895578,-0.00037000514566898346,-0.00031171925365924835,-8.318499384873945e-07,0.0019705859012901783,0.00037001678720116615,0.0003117159940302372,-0.00011411821469664574,-6.15590251982212e-05,-3.886828199028969e-05 +9,1,8.5,8.998468456478115e-09,0.0015492362139466068,-0.0003468478098511696,-0.0002919333055615425,-1.3410125925261696e-06,0.0019667870365083218,0.0003468613140285015,0.0002919272519648075,-0.00023686187341809273,-9.644916281104088e-05,-6.473483517765999e-05 +9,2,9.0,1.0769307515201554e-08,0.0015491672233875443,-0.0003237603232264519,-0.00027247238904237747,-8.826204219714029e-07,0.0019684722647070885,0.0003237677738070488,0.0002724668011069298,-0.0003811251372098923,-0.00018009915947914124,-0.00012547895312309265 +10,1,9.5,6.5991891951000525e-09,0.001549105281009374,-0.00030333735048770905,-0.00025494955480098724,-1.3582019926516864e-06,0.0019654426723718643,0.0003033336251974106,0.000254947692155838,-0.0006271977908909321,-0.00022491207346320152,-0.00016344105824828148 +10,2,10.0,6.118484829897852e-09,0.001549051989981235,-0.0002833334729075432,-0.00023819785565137863,-9.026330124450865e-07,0.001966737676411867,0.0002833292819559574,0.0002382085658609867,-0.0008610719814896584,-0.0003546644002199173,-0.00026744231581687927 +11,1,10.5,6.552038911422642e-09,0.00154901751549866,-0.0002655861899256706,-0.0002231122925877571,-1.2630542108871268e-06,0.001964384224265814,0.00026558665558695793,0.00022311368957161903,-0.0011930274777114391,-0.00039019854739308357,-0.0003034067340195179 +11,2,11.0,9.802380018797408e-09,0.0015489874147144294,-0.00024848151952028275,-0.00020880158990621567,-9.786817930512726e-07,0.0019654412753880024,0.00024848291650414467,0.00020880764350295067,-0.001470054965466261,-0.0005364310927689075,-0.0004325839690864086 +12,1,11.5,1.0565094576975298e-08,0.0015489509835935602,-0.00023323949426412582,-0.0001959698274731636,-1.174757736199794e-06,0.0019635832868516445,0.00023323623463511467,0.000195962842553854,-0.0017936332151293755,-0.0005537522956728935,-0.0004546362906694412 +12,2,12.0,1.0153207108398732e-08,0.0015489143609847475,-0.00021865405142307281,-0.00018392689526081085,-9.567065110127615e-07,0.001964456867426634,0.00021865731105208397,0.0001839236356317997,-0.00204546470195055,-0.0006773108616471291,-0.0005757706239819527 +13,1,12.5,6.847925559938517e-09,0.0015489000506591615,-0.00020564347505569458,-0.00017303228378295898,-1.229019973680856e-06,0.0019629797898232937,0.0002056504599750042,0.00017301971092820168,-0.002280890941619873,-0.00067916139960289,-0.000582011416554451 +13,2,13.0,1.1770799335231175e-08,0.0015488750333560626,-0.0001933462917804718,-0.00016286037862300873,-9.379367493789204e-07,0.0019637630321085453,0.00019335513934493065,0.00016285711899399757,-0.002459546085447073,-0.0007534711621701717,-0.0006643435917794704 +14,1,13.5,8.936060558184522e-09,0.0015488612668431816,-0.00018239393830299377,-0.00015359185636043549,-1.2376870923702654e-06,0.001962530892342329,0.000182389747351408,0.00015358394011855125,-0.002583651803433895,-0.0007450981065630913,-0.0006575053557753563 +14,2,14.0,1.2725840020655355e-08,0.0015488343418273527,-0.0001720944419503212,-0.00014511216431856155,-8.9041709272486e-07,0.001963145099580288,0.00017209816724061966,0.00014511402696371078,-0.002680632285773754,-0.0007635904476046562,-0.0006860606372356415 +15,1,14.5,9.446215296082805e-09,0.0015488229734234565,-0.0001630391925573349,-0.00013743527233600616,-1.146773010329838e-06,0.001962078735232353,0.00016304105520248413,0.00013743527233600616,-0.0027179024182260036,-0.0007485975511372089,-0.000670840498059988 +15,2,15.0,9.313422921763959e-09,0.001548801691143042,-0.00015463586896657944,-0.00013038236647844315,-9.957984490327476e-07,0.0019625588320195675,0.0001546279527246952,0.0001303856261074543,-0.002754406537860632,-0.0007191230542957783,-0.000647230539470911 +16,1,15.5,7.756034481332108e-09,0.001548795055197433,-0.00014728587120771408,-0.00012414250522851944,-1.19767199602272e-06,0.001961618661880493,0.0001472746953368187,0.00012414157390594482,-0.0027457624673843384,-0.000701194629073143,-0.0006282757967710495 +16,2,16.0,4.9820187697502405e-09,0.0015487817877766277,-0.0001406259834766388,-0.00011855922639369965,-1.0063548837591085e-06,0.001962041947990656,0.0001406143419444561,0.00011856527999043465,-0.00275089917704463,-0.0006374767981469631,-0.0005653253756463528 +17,1,16.5,7.659630707479437e-09,0.0015487774975968425,-0.0001347297802567482,-0.00011365208774805069,-1.1021201878902431e-06,0.0019611907191574574,0.00013471907004714012,0.00011365814134478569,-0.0027269930578768253,-0.0006199139170348644,-0.0005475492216646671 +17,2,17.0,8.840773640939048e-09,0.001548763244042896,-0.00012935884296894073,-0.00010930560529232025,-1.016784981322516e-06,0.0019615269266068935,0.0001293686218559742,0.00010931165888905525,-0.002721673808991909,-0.0005361568182706833,-0.00046241283416748047 +18,1,17.5,1.2304882210378842e-08,0.0015487567261606326,-0.00012471340596675873,-0.000105343759059906,-1.0469923481526422e-06,0.001960811670869589,0.0001247120089828968,0.00010533956810832024,-0.0026941243559122086,-0.0005193613469600677,-0.00044766347855329514 +18,2,18.0,7.418095471223296e-09,0.0015487429170055658,-0.00012026354670524597,-0.00010176189243793488,-9.512738775585561e-07,0.001961167436093092,0.00012026121839880943,0.00010176049545407295,-0.0026859669014811516,-0.0004291580989956856,-0.00035731401294469833 +19,1,18.5,7.707569693593541e-09,0.0015487447557849957,-0.0001163184642791748,-9.842775762081146e-05,-1.1155910571991612e-06,0.001960610970854759,0.00011632218956947327,9.842775762081146e-05,-0.0026490092277526855,-0.00040957890450954437,-0.00034233927726745605 +19,2,19.0,9.897528907565345e-09,0.001548736220618044,-0.00011231936514377594,-9.525753557682037e-05,-8.746676823934152e-07,0.0019609862938523293,0.00011232960969209671,9.52649861574173e-05,-0.0026348931714892387,-0.0003248099237680435,-0.00026043038815259933 +20,1,19.5,7.458307527130614e-09,0.0015487257938516241,-0.00010872259736061096,-9.228847920894623e-05,-1.117876357703551e-06,0.001960530411452055,0.00010872026905417442,9.2280562967062e-05,-0.0025746123865246773,-0.000293082557618618,-0.0002375887706875801 +20,2,20.0,7.1616321761780455e-09,0.0015487109979796746,-0.00010512489825487137,-8.937250822782516e-05,-9.404776560861805e-07,0.0019608777947723866,0.00010512815788388252,8.937017992138863e-05,-0.002546322997659445,-0.00022387364879250526,-0.00017382996156811714 +21,1,20.5,1.2005225979994094e-08,0.0015487181439359362,-0.00010188575834035873,-8.659716695547104e-05,-1.0574914846017691e-06,0.0019605131819844246,0.00010188296437263489,8.659809827804565e-05,-0.002445746213197708,-0.00016940850764513016,-0.00013363640755414963 +21,2,21.0,7.5469843707765e-09,0.001548692199227755,-9.881984442472458e-05,-8.39056447148323e-05,-9.763081801894558e-07,0.0019607869908213615,9.881611913442612e-05,8.391123265028e-05,-0.0023945574648678303,-0.0001229965128004551,-9.305356070399284e-05 +22,1,21.5,6.037053218443944e-09,0.0015486938404374378,-9.613670408725739e-05,-8.161552250385284e-05,-1.0525385535364862e-06,0.00196036696434021,9.6137635409832e-05,8.160900324583054e-05,-0.002243565861135721,-3.6747660487890244e-05,-2.6164110749959946e-05 +22,2,22.0,9.586391680471706e-09,0.001548693360520578,-9.382795542478561e-05,-7.957685738801956e-05,-9.683724135900462e-07,0.001960549969226122,9.383400902152061e-05,7.956428453326225e-05,-0.0021634772419929504,-1.710653305053711e-05,-1.1105090379714966e-05 +23,1,22.5,9.489836569342991e-09,0.0015486823349255578,-9.185541421175003e-05,-7.787439972162247e-05,-1.0168454692704998e-06,0.0019601034000515938,9.18535515666008e-05,7.786881178617477e-05,-0.0019649858586490154,0.00010295165702700615,8.555082604289055e-05 +23,2,23.0,6.585969006267511e-09,0.0015486694330888832,-9.038113057613373e-05,-7.635168731212616e-05,-9.023735720870008e-07,0.0019602179527282715,9.038485586643219e-05,7.635634392499924e-05,-0.001856005284935236,9.549083188176155e-05,7.625715807080269e-05 +24,1,23.5,6.188236104098799e-09,0.0015486604639943502,-8.921325206756592e-05,-7.526762783527374e-05,-1.0200224049849993e-06,0.001959813293069601,8.920999243855476e-05,7.527368143200874e-05,-0.0016284165903925896,0.0002412758767604828,0.00019868742674589157 +24,2,24.0,9.620717680847157e-09,0.0015486650695279314,-8.823629468679428e-05,-7.427390664815903e-05,-9.335468453830487e-07,0.0019598701037466526,8.823955431580544e-05,7.426505908370018e-05,-0.0014977920800447464,0.0002111736685037613,0.00016872771084308624 diff --git a/research/fine_surface_joint_20261014/blow_collisions.csv b/research/fine_surface_joint_20261014/blow_collisions.csv new file mode 100644 index 0000000..5d5b395 --- /dev/null +++ b/research/fine_surface_joint_20261014/blow_collisions.csv @@ -0,0 +1,73 @@ +step,level,substep,max_error,max_ratio,regime,drift_m,drift_px,drift_py,ideal_defect_m,ideal_defect_px,ideal_defect_py,measured_rounding_m,measured_rounding_px,measured_rounding_py +1,fine,1,6.200234548003891e-08,0.28965071213188953,True,1.6061589121818542e-05,1.7695128917694092e-08,6.51925802230835e-09,-3.41740524767431e-16,1.214306433183765e-17,-8.673617379884035e-18,1.6061589122160283e-05,1.7695128905551027e-08,6.519258030981967e-09 +1,fine,2,9.592780092493314e-08,0.3574847775115332,True,-3.2549723982810974e-07,-1.3969838619232178e-09,-1.4435499906539917e-08,-5.4539706084710815e-15,1.3877787807814457e-17,3.469446951953614e-17,-3.2549723437413913e-07,-1.3969838758010056e-09,-1.4435499941234387e-08 +1,coarse,1,1.1080350609260492e-08,0.10456730670501622,True,-1.5292316675186157e-06,-1.30385160446167e-08,-1.5832483768463135e-07,-4.288236432614667e-15,-5.551115123125783e-17,1.3877787807814457e-17,-1.5292316632303793e-06,-1.3038515989105548e-08,-1.5832483769850914e-07 +2,fine,1,7.754918973645886e-08,0.34580397879479957,True,8.987262845039368e-07,-2.3283064365386963e-08,-1.9744038581848145e-07,-5.167741234934908e-15,-1.5612511283791264e-17,2.931682674400804e-16,8.98726289671678e-07,-2.328306434977445e-08,-1.974403861116497e-07 +2,fine,2,1.155261522001183e-07,0.321440603069343,True,2.284534275531769e-06,-2.8870999813079834e-08,8.66129994392395e-08,-1.1794384913166311e-14,-7.112366251504909e-17,2.203098814490545e-16,2.2845342873261537e-06,-2.887099974195617e-08,8.661299921892962e-08 +2,coarse,1,1.6365805183271576e-08,0.1544470929589978,True,-1.426786184310913e-06,-3.0919909477233887e-07,-3.0919909477233887e-07,-6.286637876939949e-15,-8.326672684688674e-17,-8.326672684688674e-17,-1.4267861780242752e-06,-3.0919909468907214e-07,-3.0919909468907214e-07 +3,fine,1,9.149310453704373e-08,0.3150717610922152,True,4.654750227928162e-06,1.0896474123001099e-07,6.146728992462158e-08,-1.1813466871402056e-14,1.1449174941446927e-16,2.1163626406917047e-16,4.6547502397416285e-06,1.0896474111551924e-07,6.146728971298532e-08 +3,fine,2,1.0172501863081607e-07,0.3828123813437159,True,7.561873644590378e-06,1.257285475730896e-08,5.168840289115906e-08,-1.7838161503469507e-14,8.673617379884035e-18,3.2786273695961654e-16,7.561873662428539e-06,1.2572854748635343e-08,5.168840256329632e-08 +3,coarse,1,1.0010523732173482e-07,0.2854567053212911,True,9.115785360336304e-06,3.3155083656311035e-07,3.203749656677246e-07,-3.837208328860697e-15,1.5334955527634975e-15,1.2420620087993939e-15,9.115785364173512e-06,3.315508350296148e-07,3.203749644256626e-07 +4,fine,1,1.1511500297434196e-07,0.3632811360585352,True,1.1234544217586517e-05,3.3155083656311035e-07,2.3469328880310059e-07,-2.0365653607967715e-14,2.5673907444456745e-16,2.393918396847994e-16,1.1234544237952171e-05,3.315508363063713e-07,2.3469328856370875e-07 +4,fine,2,1.323716875001324e-07,0.420721981505359,True,1.0875053703784943e-05,7.171183824539185e-08,5.4016709327697754e-08,-1.6948248360293405e-14,-6.83481049534862e-16,-4.0939474033052647e-16,1.0875053720733191e-05,7.17118389288729e-08,5.4016709737092494e-08 +4,coarse,1,1.2150177930436712e-07,0.37139422446265463,True,1.3064593076705933e-05,5.997717380523682e-07,5.62518835067749e-07,-1.2559397966072083e-14,-5.967448757360216e-16,-2.498001805406602e-16,1.306459308926533e-05,5.99771738649113e-07,5.625188353175492e-07 +5,fine,1,1.2583242237074188e-07,0.3554646638422362,True,9.815674275159836e-06,-2.789311110973358e-07,-3.608874976634979e-07,-1.565240992373873e-14,-1.9949319973733282e-16,-3.642919299551295e-17,9.815674290812246e-06,-2.789311108978426e-07,-3.6088749762706873e-07 +5,fine,2,1.2541811456046048e-07,0.3685724336736591,True,9.207520633935928e-06,-2.5192275643348694e-07,-4.0512531995773315e-08,-1.5307199952019346e-14,3.469446951953614e-17,4.3021142204224816e-16,9.207520649243128e-06,-2.519227564681814e-07,-4.051253242598474e-08 +5,coarse,1,1.2532259030528792e-07,0.38942307019337585,True,1.49458646774292e-05,9.723007678985596e-07,1.2628734111785889e-06,-1.6535384173010925e-14,1.5959455978986625e-16,6.175615574477433e-16,1.4945864693964583e-05,9.72300767738965e-07,1.2628734105610273e-06 +6,fine,1,1.0399005534456052e-07,0.4260869217553865,True,5.527399480342865e-06,-8.754432201385498e-08,-1.555308699607849e-07,-1.4764231504038605e-14,4.336808689942018e-17,3.86843335142828e-16,5.5273994951070965e-06,-8.754432205722307e-08,-1.5553087034762825e-07 +6,fine,2,1.295425238190262e-07,0.36331211716460343,True,5.567912012338638e-06,-2.6542693376541138e-08,-2.0908191800117493e-07,-1.4812803761365956e-14,-5.186823193170653e-16,1.734723475976807e-18,5.567912027151442e-06,-2.654269285785882e-08,-2.0908191800290965e-07 +6,coarse,1,1.0239773140519048e-07,0.43028837580529966,True,1.3461336493492126e-05,5.308538675308228e-07,4.2654573917388916e-07,-2.033095913844818e-14,2.0816681711721685e-16,1.2212453270876722e-15,1.3461336513823086e-05,5.308538673226559e-07,4.2654573795264383e-07 +7,fine,1,1.1958961998459472e-07,0.4029625240438387,True,5.150679498910904e-06,-5.3551048040390015e-08,-7.497146725654602e-08,-1.5931700403370996e-14,-5.204170427930421e-17,-1.700029006457271e-16,5.150679514842604e-06,-5.355104798834831e-08,-7.497146708654312e-08 +7,fine,2,1.265965450247819e-07,0.3851888208747954,True,3.789551556110382e-06,0.0,3.725290298461914e-09,-1.5173626244369132e-14,7.806255641895632e-17,3.903127820947816e-16,3.7895515712840083e-06,-7.806255641895632e-17,3.725289908149132e-09 +7,coarse,1,1.0902046165828239e-07,0.38161058826685446,True,1.2835487723350525e-05,8.326023817062378e-07,-2.6635825634002686e-07,-2.4501234374696423e-14,-5.48172618408671e-16,-2.5673907444456745e-16,1.283548774785176e-05,8.326023822544104e-07,-2.663582560832878e-07 +8,fine,1,1.2448945463372496e-07,0.3720247984466396,True,2.2617168724536896e-06,7.869675755500793e-08,3.259629011154175e-09,-1.5289852717259578e-14,7.28583859910259e-17,-2.636779683484747e-16,2.2617168877435423e-06,7.869675748214955e-08,3.259629274832143e-09 +8,fine,2,1.3473279458775522e-07,0.39946262369614577,True,2.4368055164813995e-06,7.031485438346863e-08,-1.5366822481155396e-08,-1.6287318715946242e-14,4.683753385137379e-17,-1.196959198423997e-16,2.4368055327687183e-06,7.03148543366311e-08,-1.5366822361459476e-08 +8,coarse,1,1.265961931951054e-07,0.38341345468786764,True,8.130446076393127e-06,7.506459951400757e-07,-5.830079317092896e-07,-2.2391810627908626e-14,-1.6861512186494565e-15,1.0408340855860843e-16,8.130446098784938e-06,7.506459968262269e-07,-5.83007931813373e-07 +9,fine,1,1.3222774730703435e-07,0.3900959817916434,True,2.078711986541748e-06,8.568167686462402e-08,6.239861249923706e-08,-1.5612511283791264e-14,-2.5326962749261384e-16,2.42861286636753e-16,2.0787120021542593e-06,8.568167711789365e-08,6.239861225637577e-08 +9,fine,2,1.2824470274619415e-07,0.4272642246416919,True,8.78702849149704e-07,9.266659617424011e-08,-1.3830140233039856e-07,-1.4988010832439613e-14,-1.6653345369377348e-16,-1.2836953722228372e-16,8.787028641377148e-07,9.266659634077357e-08,-1.3830140220202902e-07 +9,coarse,1,1.1335454486172125e-07,0.3876201969620664,True,5.185604095458984e-06,-2.384185791015625e-07,-6.07222318649292e-07,-2.583350200424661e-14,3.122502256758253e-16,7.632783294297951e-17,5.185604121292486e-06,-2.384185794138127e-07,-6.072223187256198e-07 +10,fine,1,1.2645846059200494e-07,0.3781818251482199,True,2.073124051094055e-06,6.426125764846802e-08,1.0151416063308716e-07,-1.6764367671839864e-14,2.949029909160572e-16,-2.1163626406917047e-16,2.073124067858423e-06,6.426125735356503e-08,1.0151416084472342e-07 +10,fine,2,1.3663077158554415e-07,0.43888780198316496,True,1.5008263289928436e-06,7.031485438346863e-08,1.9883736968040466e-07,-1.6273440928138427e-14,-1.4051260155412137e-16,6.071532165918825e-17,1.5008263452662846e-06,7.031485452398123e-08,1.9883736961968934e-07 +10,coarse,1,1.5257769281351585e-07,0.4176679708473079,True,4.520639777183533e-06,-5.904585123062134e-07,-3.166496753692627e-08,-2.443184543565735e-14,-4.649058915617843e-16,1.0408340855860843e-16,4.520639801615378e-06,-5.904585118413075e-07,-3.166496764100968e-08 +11,fine,1,1.4342478449336227e-07,0.40055388671598813,True,9.159557521343231e-07,1.4388933777809143e-07,1.103617250919342e-07,-1.6368850719317152e-14,-7.979727989493313e-17,-1.3877787807814457e-17,9.159557685031738e-07,1.438893378578887e-07,1.1036172510581199e-07 +11,fine,2,1.229973988214894e-07,0.44018383771634995,True,1.3504177331924438e-06,-2.7939677238464355e-08,-3.725290298461914e-09,-1.6167622796103842e-14,-1.942890293094024e-16,1.457167719820518e-16,1.3504177493600666e-06,-2.7939677044175326e-08,-3.725290444178686e-09 +11,coarse,1,1.0126133054289e-07,0.37920635013850246,True,2.175569534301758e-06,-1.341104507446289e-07,1.2665987014770508e-07,-2.38073449843057e-14,9.020562075079397e-17,5.759281940243e-16,2.175569558109103e-06,-1.3411045083483453e-07,1.2665986957177688e-07 +12,fine,1,1.2071681543268653e-07,0.4311470967916149,True,1.3746321201324463e-06,-2.1420419216156006e-08,1.4528632164001465e-07,-1.6273440928138427e-14,-2.237793284010081e-16,-4.0072112295064244e-16,1.3746321364058872e-06,-2.1420418992376677e-08,1.4528632204073577e-07 +12,fine,2,1.371591822341145e-07,0.44227593234711177,True,1.982320100069046e-06,9.73232090473175e-08,1.448206603527069e-07,-1.6818144099595145e-14,-2.96637714392034e-16,1.214306433183765e-17,1.98232011688719e-06,9.732320934395522e-08,1.4482066034056384e-07 +12,coarse,1,1.2813768046626706e-07,0.42388935775355246,True,3.3173710107803345e-06,-4.898756742477417e-07,-1.8067657947540283e-07,-2.7193525209412428e-14,-1.1171619185290638e-15,-4.649058915617843e-16,3.3173710379738597e-06,-4.898756731305798e-07,-1.8067657901049694e-07 +13,fine,1,1.3950153099351326e-07,0.4396993900025004,True,1.2670643627643585e-06,2.3050233721733093e-07,1.2153759598731995e-07,-1.662038562333379e-14,3.903127820947816e-16,9.194034422677078e-17,1.2670643793847441e-06,2.3050233682701815e-07,1.215375958953796e-07 +13,fine,2,1.2581214114959494e-07,0.4721292711508529,True,1.1995434761047363e-06,3.7159770727157593e-07,1.0710209608078003e-07,-1.5909148998183298e-14,-8.153200337090993e-17,9.540979117872439e-17,1.1995434920138853e-06,3.7159770735310793e-07,1.0710209598537024e-07 +13,coarse,1,1.2660152992616247e-07,0.45318197065007865,True,7.878988981246948e-07,-1.210719347000122e-07,3.334134817123413e-07,-2.346040028911034e-14,-4.2327252813834093e-16,2.706168622523819e-16,7.878989215850951e-07,-1.2107193427673968e-07,3.3341348144172445e-07 +14,fine,1,1.5054562552130335e-07,0.5104225030616341,True,6.658956408500671e-07,1.778826117515564e-07,-2.60770320892334e-08,-1.6335890973273592e-14,2.96637714392034e-16,3.86843335142828e-16,6.658956571859581e-07,1.7788261145491868e-07,-2.6077032476076734e-08 +14,fine,2,1.3530934717120857e-07,0.4009751179733903,True,1.2051314115524292e-06,-1.955777406692505e-08,1.6205012798309326e-07,-1.6099968580540747e-14,-1.5785983631388945e-16,8.500145032286355e-17,1.2051314276523978e-06,-1.9557773909065213e-08,1.620501278980918e-07 +14,coarse,1,1.3409460186686317e-07,0.39963893479139145,True,3.9692968130111694e-06,8.754432201385498e-08,2.9616057872772217e-07,-2.5528190672474693e-14,-6.245004513516506e-17,-6.314393452555578e-16,3.96929683853936e-06,8.754432207630503e-08,2.961605793591615e-07 +15,fine,1,1.2702620799665e-07,0.37981873927853255,True,1.000240445137024e-06,-3.166496753692627e-08,7.729977369308472e-08,-1.607568245187707e-14,-2.1337098754514727e-16,1.4051260155412137e-16,1.0002404612127064e-06,-3.166496732355528e-08,7.729977355257212e-08 +15,fine,2,1.1264902777252672e-07,0.42131603992753336,True,8.651986718177795e-07,-4.377216100692749e-08,-1.0151416063308716e-07,-1.5992415725030185e-14,4.336808689942018e-17,3.2959746043559335e-17,8.651986878101953e-07,-4.377216105029558e-08,-1.015141606660469e-07 +15,coarse,1,1.305862756817433e-07,0.5086178241462508,True,1.6335397958755493e-06,-6.146728992462158e-08,2.2165477275848389e-07,-2.533390164316529e-14,-4.85722573273506e-17,2.706168622523819e-16,1.633539821209451e-06,-6.146728987604932e-08,2.2165477248786702e-07 +16,fine,1,1.3092614292720128e-07,0.40502514569399495,True,9.629875421524048e-07,-9.685754776000977e-08,8.66129994392395e-08,-1.6838960781306866e-14,-9.194034422677078e-17,8.500145032286355e-17,9.629875589913656e-07,-9.685754766806942e-08,8.661299935423805e-08 +16,fine,2,1.3893401662468108e-07,0.39764517507033376,True,1.5990808606147766e-06,-8.009374141693115e-08,-5.3085386753082275e-08,-1.6518036938251157e-14,3.0531133177191805e-16,3.5735303605122226e-16,1.5990808771328135e-06,-8.009374172224248e-08,-5.308538711043531e-08 +16,coarse,1,1.2888908407227007e-07,0.4083972967001409,True,5.159527063369751e-06,-4.3213367462158203e-07,1.4901161193847656e-07,-2.6131874442114622e-14,7.216449660063518e-16,-3.885780586188048e-16,5.159527089501625e-06,-4.32133675343227e-07,1.4901161232705462e-07 +17,fine,1,1.249536419889452e-07,0.39288318869275274,True,1.12876296043396e-06,-1.7601996660232544e-07,-2.3283064365386963e-07,-1.7957857423311907e-14,-5.551115123125783e-16,1.3530843112619095e-16,1.1287629783918174e-06,-1.7601996604721393e-07,-2.3283064378917806e-07 +17,fine,2,1.3328934989065289e-07,0.46401164838116316,True,7.129274308681488e-07,-2.1373853087425232e-07,-2.6496127247810364e-07,-1.634803403760543e-14,-2.914335439641036e-16,9.71445146547012e-17,7.129274472161828e-07,-2.1373853058281878e-07,-2.6496127257524815e-07 +17,coarse,1,1.246264329513025e-07,0.4613853551985751,True,5.302950739860535e-06,-2.0675361156463623e-07,1.1362135410308838e-07,-2.8373137173076657e-14,7.7021722333370235e-16,-6.869504964868156e-16,5.302950768233672e-06,-2.0675361233485345e-07,1.1362135479003888e-07 +18,fine,1,1.5840482392448507e-07,0.48249679461224454,True,8.10716301202774e-07,-1.4016404747962952e-07,-2.6402994990348816e-07,-1.6878859421254333e-14,7.632783294297951e-17,2.0816681711721685e-17,8.107163180816335e-07,-1.4016404755595735e-07,-2.6402994992430484e-07 +18,fine,2,1.217794476371381e-07,0.4447119430321027,True,1.4016404747962952e-07,-2.8545036911964417e-07,-8.847564458847046e-09,-1.709223040879948e-14,-1.1275702593849246e-16,1.8214596497756474e-16,1.4016406457185993e-07,-2.8545036900688714e-07,-8.847564640993011e-09 +18,coarse,1,1.3857981828735433e-07,0.4519491616828685,True,5.850568413734436e-06,-1.2479722499847412e-07,-1.471489667892456e-07,-2.688821387764051e-14,-8.534839501805891e-16,9.08995101411847e-16,5.85056844062265e-06,-1.2479722414499017e-07,-1.471489676982407e-07 +19,fine,1,1.4433919059975153e-07,0.3821888438774327,True,1.9441358745098114e-06,-1.3969838619232178e-09,-2.7474015951156616e-08,-1.628905343942222e-14,-3.920475055707584e-16,2.42861286636753e-17,1.944135890798865e-06,-1.3969834698757122e-09,-2.7474015975442745e-08 +19,fine,2,1.4349667698532187e-07,0.4183999473130793,True,2.1490268409252167e-06,1.7834827303886414e-07,-7.869675755500793e-08,-1.678344963007561e-14,-5.204170427930421e-18,2.949029909160572e-17,2.1490268577086663e-06,1.783482730440683e-07,-7.869675758449823e-08 +19,coarse,1,1.264100825126846e-07,0.5347769553832019,True,5.165114998817444e-06,3.91155481338501e-08,1.1734664440155029e-07,-2.6804947150793623e-14,-4.2327252813834093e-16,-3.8163916471489756e-16,5.165115025622391e-06,3.9115548557122626e-08,1.1734664478318946e-07 +20,fine,1,1.1464598925758906e-07,0.39800949885565845,True,1.8593855202198029e-06,7.031485438346863e-08,-2.2817403078079224e-08,-1.695171780724536e-14,1.457167719820518e-16,-7.632783294297951e-17,1.8593855371715207e-06,7.031485423775186e-08,-2.281740300175139e-08 +20,fine,2,1.3166252321727967e-07,0.41581763506478076,True,2.2118911147117615e-06,9.313225746154785e-10,9.033828973770142e-08,-1.7095699855751434e-14,-3.7643499428696714e-16,2.0990154059319366e-16,2.2118911318074613e-06,9.313229510504728e-10,9.033828952779988e-08 +20,coarse,1,1.3024161815700097e-07,0.47356066681074566,True,4.023313522338867e-06,5.997717380523682e-07,-8.568167686462402e-08,-2.7228219678931964e-14,3.0531133177191805e-16,3.7470027081099033e-16,4.023313549567087e-06,5.997717377470568e-07,-8.56816772393243e-08 +21,fine,1,1.361732063775989e-07,0.4205892378883329,True,2.439599484205246e-06,1.4854595065116882e-07,-1.327134668827057e-07,-1.6781714906599632e-14,3.885780586188048e-16,8.673617379884035e-17,2.439599500986961e-06,1.4854595026259076e-07,-1.3271346696944186e-07 +21,fine,2,1.2473161092874108e-07,0.45376916235253945,True,2.2514723241329193e-06,3.5902485251426697e-07,1.9976869225502014e-07,-1.692396223162973e-14,6.938893903907228e-17,-1.457167719820518e-16,2.2514723410568815e-06,3.5902485244487803e-07,1.9976869240073691e-07 +21,coarse,1,1.5484813187249813e-07,0.561763881940829,True,3.507360816001892e-06,7.431954145431519e-07,6.202608346939087e-07,-2.6131874442114622e-14,-4.579669976578771e-16,1.5265566588595902e-16,3.5073608421337665e-06,7.431954150011189e-07,6.20260834541253e-07 +22,fine,1,1.1594882032284204e-07,0.46103443091228286,True,1.2228265404701233e-06,2.300366759300232e-07,1.9185245037078857e-07,-1.5529244556944377e-14,-3.469446951953614e-18,7.28583859910259e-17,1.2228265559993678e-06,2.3003667593349264e-07,1.918524502979302e-07 +22,fine,2,1.4032262196650436e-07,0.41123793671363457,True,2.0829029381275177e-06,1.317821443080902e-07,1.1594966053962708e-07,-1.6656814816329302e-14,-2.42861286636753e-17,2.7755575615628914e-17,2.0829029547843325e-06,1.3178214433237634e-07,1.159496605118715e-07 +22,coarse,1,1.4061314457247676e-07,0.5696050037738337,True,5.517154932022095e-06,1.6167759895324707e-06,1.0058283805847168e-06,-2.643718577388654e-14,-4.996003610813204e-16,-4.579669976578771e-16,5.5171549584592805e-06,1.616775990032071e-06,1.0058283810426838e-06 +23,fine,1,1.172129048265802e-07,0.43537551205849856,True,1.8416903913021088e-06,2.230517566204071e-07,2.1746382117271423e-07,-1.620752143605131e-14,-4.735795089416683e-16,1.9081958235744878e-17,1.8416904075096302e-06,2.2305175709398661e-07,2.1746382115363228e-07 +23,fine,2,1.2559042006365928e-07,0.4297035689234779,True,1.998152583837509e-06,7.031485438346863e-08,4.98257577419281e-08,-1.62231339473351e-14,3.0184188481996443e-16,-3.7816971776294395e-16,1.998152600060643e-06,7.031485408162674e-08,4.982575812009782e-08 +23,coarse,1,1.5135824793510722e-07,0.4407189177218073,True,1.2038275599479675e-05,1.3243407011032104e-06,7.692724466323853e-07,-2.7304547511874944e-14,1.4502288259166107e-15,-4.371503159461554e-16,1.2038275626784223e-05,1.3243406996529816e-06,7.692724470695356e-07 +24,fine,1,1.1879041472706575e-07,0.3912946498849803,True,1.0398216545581818e-06,1.62515789270401e-07,1.3737007975578308e-07,-1.705927066275592e-14,1.6306400674181987e-16,-9.020562075079397e-17,1.0398216716174524e-06,1.62515789107337e-07,1.373700798459887e-07 +24,fine,2,1.4235627243674998e-07,0.4195513876580241,True,1.6004778444766998e-06,1.3830140233039856e-07,1.7927959561347961e-07,-1.668977456237286e-14,-1.9949319973733282e-16,1.2663481374630692e-16,1.6004778611664744e-06,1.3830140252989176e-07,1.792795954868448e-07 +24,coarse,1,1.5865499780609582e-07,0.5231448442629695,True,9.544193744659424e-06,4.5821070671081543e-07,2.942979335784912e-07,-2.545880173343562e-14,3.8163916471489756e-16,-1.457167719820518e-16,9.544193770118226e-06,4.5821070632917626e-07,2.94297933724208e-07 diff --git a/research/fine_surface_joint_20261014/blow_ledger.csv b/research/fine_surface_joint_20261014/blow_ledger.csv new file mode 100644 index 0000000..b43bbfd --- /dev/null +++ b/research/fine_surface_joint_20261014/blow_ledger.csv @@ -0,0 +1,25 @@ +step,time,average_bound_ratio,leaf_m,leaf_px,leaf_py,delta_m,delta_px,delta_py,boundary_m,boundary_px,boundary_py,fine_transfer_m,fine_transfer_px,fine_transfer_py,coarse_transfer_m,coarse_transfer_px,coarse_transfer_py,raw_m,raw_px,raw_py,collision_drift_m,collision_drift_px,collision_drift_py,average_rounding_m,average_rounding_px,average_rounding_py,closure_m,closure_px,closure_py,cumulative_raw_m,cumulative_raw_px,cumulative_raw_py,cumulative_closure_m,cumulative_closure_px,cumulative_closure_py +1,1,0.28124994289828603,560.7534663206898,0.0016594058834016323,0.0014196881093084812,0.003462142776697874,0.0016594058834016323,0.0014196881093084812,0.0034477608278393745,0.0016594044864177704,0.001420031301677227,-3.557652235031128e-07,0.0,0.0,5.308538675308228e-07,-1.862645149230957e-09,-1.7695128917694092e-07,1.4206860214471817e-05,3.259629011154175e-09,-1.6624107956886292e-07,1.4206860214471817e-05,3.259629011154175e-09,-1.6624107956886292e-07,1.7508864402770996e-07,-1.862645149230957e-09,-1.7695128917694092e-07,0.0,0.0,0.0,1.4206860214471817e-05,3.259629011154175e-09,-1.6624107956886292e-07,0.0,0.0,0.0 +2,2,0.37499987985940486,560.7572004375979,0.003110479563474655,0.002638322301208973,0.0037341169081628323,0.0014510736800730228,0.0012186341919004917,0.003732521552592516,0.0014515905641019344,0.0012190532870590687,-2.193264663219452e-06,-4.6566128730773926e-09,-1.685693860054016e-07,2.032145857810974e-06,-1.5087425708770752e-07,1.695007085800171e-07,1.7564743757247925e-06,-3.6135315895080566e-07,-4.200264811515808e-07,1.7564743757247925e-06,-3.6135315895080566e-07,-4.200264811515808e-07,-1.6111880540847778e-07,-1.555308699607849e-07,9.313225746154785e-10,0.0,0.0,0.0,1.596333459019661e-05,-3.580935299396515e-07,-5.862675607204437e-07,0.0,0.0,0.0 +3,3,0.2812499146093721,560.7611049492843,0.004511175211519003,0.0038183839060366154,0.00390451168641448,0.0014006956480443478,0.0011800616048276424,0.0038831778801977634,0.0014002365060150623,0.0011796201579272747,-3.6400742828845978e-06,4.698522388935089e-07,4.6798959374427795e-07,3.641471266746521e-06,-4.637986421585083e-07,-4.600733518600464e-07,2.1332409232854843e-05,4.530884325504303e-07,4.3353065848350525e-07,2.1332409232854843e-05,4.530884325504303e-07,4.3353065848350525e-07,1.3969838619232178e-09,6.05359673500061e-09,7.916241884231567e-09,0.0,0.0,0.0,3.729574382305145e-05,9.499490261077881e-08,-1.5273690223693848e-07,0.0,0.0,0.0 +4,4,0.37499987985940486,560.7650738614611,0.005782689433544874,0.004893188830465078,0.003968912176787853,0.0012715142220258713,0.001074804924428463,0.003933848347514868,0.0012704567052423954,0.001073895487934351,-6.910879164934158e-06,3.1711533665657043e-07,3.9534643292427063e-07,6.800517439842224e-06,-2.6263296604156494e-07,-3.371387720108032e-07,3.517419099807739e-05,1.0030344128608704e-06,8.512288331985474e-07,3.517419099807739e-05,1.0030344128608704e-06,8.512288331985474e-07,-1.103617250919342e-07,5.448237061500549e-08,5.820766091346741e-08,0.0,0.0,0.0,7.246993482112885e-05,1.0980293154716492e-06,6.984919309616089e-07,0.0,0.0,0.0 +5,5,0.3749998295680158,560.7690546456724,0.006910111755132675,0.005846448242664337,0.003980784211307764,0.001127422321587801,0.0009532594121992588,0.0039466856978833675,0.001126923132687807,0.0009523364715278149,-7.287599146366119e-06,1.0672956705093384e-06,4.637986421585083e-07,7.417052984237671e-06,-1.0095536708831787e-06,-4.023313522338867e-07,3.396905958652496e-05,4.414469003677368e-07,8.614733815193176e-07,3.396905958652496e-05,4.414469003677368e-07,8.614733815193176e-07,1.2945383787155151e-07,5.774199962615967e-08,6.146728992462158e-08,0.0,0.0,0.0,0.00010643899440765381,1.539476215839386e-06,1.5599653124809265e-06,0.0,0.0,0.0 +6,6,0.46874973195382685,560.7730254461057,0.007904952857643366,0.006686040665954351,0.003970800433307886,0.0009948411025106907,0.0008395924232900143,0.003946303389966488,0.0009944625198841095,0.00083962082862854,-6.226822733879089e-06,2.0954757928848267e-07,-1.8533319234848022e-07,6.167218089103699e-06,-2.477318048477173e-07,9.499490261077881e-08,2.455664798617363e-05,4.1676685214042664e-07,6.193295121192932e-08,2.455664798617363e-05,4.1676685214042664e-07,6.193295121192932e-08,-5.960464477539063e-08,-3.818422555923462e-08,-9.033828973770142e-08,0.0,0.0,0.0,0.00013099564239382744,1.9562430679798126e-06,1.6218982636928558e-06,0.0,0.0,0.0 +7,7,0.4687496533735736,560.7769900038838,0.008779809810221195,0.007423080503940582,0.003964557778090239,0.0008748569525778294,0.0007370398379862309,0.003942790906876326,0.0008741165511310101,0.0007373974658548832,-2.6883091777563095e-05,-1.3766344636678696e-05,-7.656868547201157e-06,2.6874244213104248e-05,1.3727694749832153e-05,7.636845111846924e-06,2.177571877837181e-05,7.790513336658478e-07,-3.3760443329811096e-07,2.177571877837181e-05,7.790513336658478e-07,-3.3760443329811096e-07,-8.847564458847046e-09,-3.864988684654236e-08,-2.0023435354232788e-08,0.0,0.0,0.0,0.00015277136117219925,2.7352944016456604e-06,1.2842938303947449e-06,0.0,0.0,0.0 +8,8,0.4687496533735736,560.7809417177923,0.009547093417495489,0.00806809077039361,0.0039517139084637165,0.0007672836072742939,0.0006450102664530277,0.0039388518780469894,0.0007664291188120842,0.0006456412374973297,-0.00016948627308011055,-8.736597374081612e-05,-5.452195182442665e-05,0.0001695193350315094,8.732080459594727e-05,5.4486095905303955e-05,1.2828968465328217e-05,8.996576070785522e-07,-5.951151251792908e-07,1.2828968465328217e-05,8.996576070785522e-07,-5.951151251792908e-07,3.306195139884949e-08,-4.516914486885071e-08,-3.585591912269592e-08,0.0,0.0,0.0,0.00016560032963752747,3.6349520087242126e-06,6.891787052154541e-07,0.0,0.0,0.0 +9,9,0.4686406250816172,560.7848850805312,0.010217653587460518,0.008631827309727669,0.0039433627389371395,0.0006705601699650288,0.0005637365393340588,0.00393525930121541,0.0006706290878355503,0.0005643940530717373,-0.000617987010627985,-0.0002765483222901821,-0.00019021378830075264,0.0006179474294185638,0.00027653947472572327,0.00019023939967155457,8.143018931150436e-06,-6.007030606269836e-08,-6.831251084804535e-07,8.143018931150436e-06,-6.007030606269836e-08,-6.831251084804535e-07,-3.958120942115784e-08,-8.847564458847046e-09,2.561137080192566e-08,0.0,0.0,0.0,0.0001737433485686779,3.5748817026615143e-06,6.05359673500061e-09,0.0,0.0,0.0 +10,10,0.4685945715880829,560.7888254267164,0.010803885292261839,0.00912527134642005,0.00394034618511796,0.000586231704801321,0.0004934440366923809,0.0039321803487837315,0.000586662907153368,0.0004931562580168247,-0.0014882697723805904,-0.0005795764736831188,-0.00043088337406516075,0.0014883410185575485,0.0005796011537313461,0.00043090246617794037,8.094590157270432e-06,-4.5588240027427673e-07,2.6868656277656555e-07,8.094590157270432e-06,-4.5588240027427673e-07,2.6868656277656555e-07,7.12461769580841e-08,2.468004822731018e-08,1.909211277961731e-08,0.0,0.0,0.0,0.00018183793872594833,3.1189993023872375e-06,2.7474015951156616e-07,0.0,0.0,0.0 +11,11,0.37499977927664024,560.7927596913651,0.011317913420498371,0.009557455778121948,0.003934264648705721,0.0005140281282365322,0.0004321844317018986,0.003929825499653816,0.0005140695720911026,0.0004319213330745697,-0.0026630824431777,-0.0009266296401619911,-0.0007359907031059265,0.002663079649209976,0.0009266063570976257,0.0007360205054283142,4.441943019628525e-06,-1.816079020500183e-08,2.3329630494117737e-07,4.441943019628525e-06,-1.816079020500183e-08,2.3329630494117737e-07,-2.7939677238464355e-09,-2.3283064365386963e-08,2.9802322387695312e-08,0.0,0.0,0.0,0.00018627988174557686,3.1008385121822357e-06,5.080364644527435e-07,0.0,0.0,0.0 +12,12,0.46874663591177923,560.7966943499632,0.011769441422075033,0.009937478695064783,0.003934658598154783,0.00045152800157666206,0.00038002291694283485,0.003928040154278278,0.00045189354568719864,0.0003798864781856537,-0.0038390979170799255,-0.0012310631573200226,-0.0010304069146513939,0.0038390420377254486,0.0012311115860939026,0.0010304339230060577,6.674323230981827e-06,-4.139728844165802e-07,1.0943040251731873e-07,6.674323230981827e-06,-4.139728844165802e-07,1.0943040251731873e-07,-5.587935447692871e-08,4.842877388000488e-08,2.7008354663848877e-08,0.0,0.0,0.0,0.00019295420497655869,2.6868656277656555e-06,6.174668669700623e-07,0.0,0.0,0.0 +13,13,0.37499972898527817,560.8006243831478,0.01216893782839179,0.010273906867951155,0.0039300331845879555,0.0003994964063167572,0.0003364281728863716,0.003926742821931839,0.00039900559931993484,0.00033587682992219925,-0.004740437027066946,-0.0014326325617730618,-0.0012463550083339214,0.004740472882986069,0.0014326423406600952,0.0012463442981243134,3.2545067369937897e-06,4.810281097888947e-07,5.620531737804413e-07,3.2545067369937897e-06,4.810281097888947e-07,5.620531737804413e-07,3.585591912269592e-08,9.778887033462524e-09,-1.0710209608078003e-08,0.0,0.0,0.0,0.00019620871171355247,3.16789373755455e-06,1.1795200407505035e-06,0.0,0.0,0.0 +14,14,0.4687474688530803,560.8045558938757,0.012523647397756577,0.010573056526482105,0.003931510727852583,0.00035470956936478615,0.00029914965853095055,0.003925675991922617,0.00035448791459202766,0.00029869796708226204,-0.005264284089207649,-0.0015086885541677475,-0.0013435659930109978,0.0052642785012722015,0.0015086643397808075,0.0013435855507850647,5.840323865413666e-06,2.4586915969848633e-07,4.3213367462158203e-07,5.840323865413666e-06,2.4586915969848633e-07,4.3213367462158203e-07,-5.587935447692871e-09,-2.421438694000244e-08,1.955777406692505e-08,0.0,0.0,0.0,0.00020204903557896614,3.4137628972530365e-06,1.6116537153720856e-06,0.0,0.0,0.0 +15,15,0.4682317851482336,560.8084840090014,0.012841148767620325,0.010841074865311384,0.003928115125745535,0.00031750136986374855,0.00026801833882927895,0.003924637567251921,0.00031766900792717934,0.00026782089844346046,-0.005472308956086636,-0.0014677206054329872,-0.001318071037530899,0.005472287535667419,0.001467689871788025,0.001318071037530899,3.4989789128303528e-06,-1.3690441846847534e-07,1.9744038581848145e-07,3.4989789128303528e-06,-1.3690441846847534e-07,1.9744038581848145e-07,-2.1420419216156006e-08,-3.073364496231079e-08,0.0,0.0,0.0,0.0,0.0002055480144917965,3.276858478784561e-06,1.809094101190567e-06,0.0,0.0,0.0 +16,16,0.4687439328019107,560.8124153451063,0.013128423597663641,0.011083992663770914,0.0039313361048698425,0.0002872748300433159,0.00024291779845952988,0.003923660609871149,0.0002878890372812748,0.00024270685389637947,-0.005496661644428968,-0.0013386714272201061,-0.0011936011724174023,0.005496615543961525,0.0013386663049459457,0.001193629577755928,7.721595466136932e-06,-6.09084963798523e-07,1.825392246246338e-07,7.721595466136932e-06,-6.09084963798523e-07,1.825392246246338e-07,-4.6100467443466187e-08,-5.122274160385132e-09,2.8405338525772095e-08,0.0,0.0,0.0,0.00021326960995793343,2.667773514986038e-06,1.991633325815201e-06,0.0,0.0,0.0 +17,17,0.46873638940438433,560.8163452413864,0.013391933869570494,0.011306562926620245,0.003929896280169487,0.0002635102719068527,0.0002225702628493309,0.003922717645764351,0.0002640876919031143,0.00022296980023384094,-0.005448666866868734,-0.0011560707353055477,-0.0010099620558321476,0.005448700860142708,0.0011560898274183273,0.0010099466890096664,7.1446411311626434e-06,-5.96512109041214e-07,-3.841705620288849e-07,7.1446411311626434e-06,-5.96512109041214e-07,-3.841705620288849e-07,3.3993273973464966e-08,1.909211277961731e-08,-1.5366822481155396e-08,0.0,0.0,0.0,0.00022041425108909607,2.0712614059448242e-06,1.607462763786316e-06,0.0,0.0,0.0 +18,18,0.4687180348178792,560.8202739986591,0.013636329676955938,0.011513229925185442,0.003928757272660732,0.00024439580738544464,0.000206666998565197,0.003921979106962681,0.00024497322738170624,0.0002071000635623932,-0.00538009125739336,-0.0009485194459557533,-0.0008049774914979935,0.005380067974328995,0.0009484924376010895,0.0008049644529819489,6.80144876241684e-06,-5.504116415977478e-07,-4.200264811515808e-07,6.80144876241684e-06,-5.504116415977478e-07,-4.200264811515808e-07,-2.3283064365386963e-08,-2.7008354663848877e-08,-1.30385160446167e-08,0.0,0.0,0.0,0.0002272156998515129,1.5208497643470764e-06,1.1874362826347351e-06,0.0,0.0,0.0 +19,19,0.4687494647810733,560.8242048402317,0.013865197543054819,0.011706916149705648,0.003930841572582722,0.00022886786609888077,0.00019368622452020645,0.0039215972647070885,0.00022865179926156998,0.00019369274377822876,-0.005283902399241924,-0.0007343888282775879,-0.0006027696654200554,0.005283888429403305,0.0007343888282775879,0.0006027519702911377,9.258277714252472e-06,2.1606683731079102e-07,1.1175870895385742e-08,9.258277714252472e-06,2.1606683731079102e-07,1.1175870895385742e-08,-1.3969838619232178e-08,0.0,-1.7695128917694092e-08,0.0,0.0,0.0,0.00023647397756576538,1.7369166016578674e-06,1.1986121535301208e-06,0.0,0.0,0.0 +20,20,0.468749291904748,560.8281343518756,0.01407972676679492,0.011888547334820032,0.003929511643946171,0.00021452922374010086,0.0001816311851143837,0.0039214082062244415,0.00021384842693805695,0.00018165074288845062,-0.005120935384184122,-0.0005169562064111233,-0.00041141873225569725,0.005120944231748581,0.0005169659852981567,0.00041141733527183533,8.094590157270432e-06,6.710179150104523e-07,-1.816079020500183e-08,8.094590157270432e-06,6.710179150104523e-07,-1.816079020500183e-08,8.847564458847046e-09,9.778887033462524e-09,-1.3969838619232178e-09,0.0,0.0,0.0,0.0002445685677230358,2.4079345166683197e-06,1.180451363325119e-06,0.0,0.0,0.0 +21,21,0.4686316241476506,560.8320638332516,0.014281701296567917,0.012059765867888927,0.003929481375962496,0.0002019745297729969,0.00017121853306889534,0.003921300172805786,0.000200699083507061,0.00017050933092832565,-0.004840303678065538,-0.00029240502044558525,-0.00022668996825814247,0.004840286448597908,0.00029242970049381256,0.00022671185433864594,8.198432624340057e-06,1.2507662177085876e-06,6.873160600662231e-07,8.198432624340057e-06,1.2507662177085876e-06,6.873160600662231e-07,-1.7229467630386353e-08,2.468004822731018e-08,2.1886080503463745e-08,0.0,0.0,0.0,0.00025276700034737587,3.6587007343769073e-06,1.8677674233913422e-06,0.0,0.0,0.0 +22,22,0.46868277541627273,560.835993598681,0.014473678078502417,0.012222256977111101,0.0039297654293477535,0.00019197678193449974,0.0001624911092221737,0.003920916933566332,0.00018997164443135262,0.0001611732877790928,-0.004407043103128672,-5.385419353842735e-05,-3.726920112967491e-05,0.004407068714499474,5.3880736231803894e-05,3.727339208126068e-05,8.822884410619736e-06,1.978594809770584e-06,1.3136304914951324e-06,8.822884410619736e-06,1.978594809770584e-06,1.3136304914951324e-06,2.561137080192566e-08,2.6542693376541138e-08,4.190951585769653e-09,0.0,0.0,0.0,0.0002615898847579956,5.6372955441474915e-06,3.1813979148864746e-06,0.0,0.0,0.0 +23,23,0.4687343150126283,560.8399298018776,0.014657547231763601,0.01237749820575118,0.003936203196644783,0.0001838691532611847,0.0001552412286400795,0.003920321352779865,0.000182238407433033,0.000154225155711174,-0.0038209911435842514,0.0001984424889087677,0.00016180798411369324,0.00382099486887455,-0.00019842945039272308,-0.00016182847321033478,1.5878118574619293e-05,1.6177073121070862e-06,1.0365620255470276e-06,1.5878118574619293e-05,1.6177073121070862e-06,1.0365620255470276e-06,3.725290298461914e-09,1.30385160446167e-08,-2.0489096641540527e-08,0.0,0.0,0.0,0.0002774680033326149,7.255002856254578e-06,4.217959940433502e-06,0.0,0.0,0.0 +24,24,0.46876041911371336,560.8438616539352,0.014835720416158438,0.012527641374617815,0.0039318520575761795,0.00017817318439483643,0.00015014316886663437,0.003919683396816254,0.0001774495467543602,0.00014953874051570892,-0.003126208670437336,0.0004524495452642441,0.0003674151375889778,0.0031261928379535675,-0.00045248493552207947,-0.0003674216568470001,1.2184493243694305e-05,7.59027898311615e-07,6.109476089477539e-07,1.2184493243694305e-05,7.59027898311615e-07,6.109476089477539e-07,-1.5832483768463135e-08,-3.5390257835388184e-08,-6.51925802230835e-09,0.0,0.0,0.0,0.0002896524965763092,8.014030754566193e-06,4.828907549381256e-06,0.0,0.0,0.0 diff --git a/research/fine_surface_joint_20261014/blow_propagation.csv b/research/fine_surface_joint_20261014/blow_propagation.csv new file mode 100644 index 0000000..f06d80d --- /dev/null +++ b/research/fine_surface_joint_20261014/blow_propagation.csv @@ -0,0 +1,97 @@ +metric,time,signal,baseline,absolute,any_crossed,peak_crossed,x,y,q +coarse_interface_u,1,0.0,0.0,0.0,False,False,3.5,3.5, +coarse_interface_u,2,0.0,2.63417801721126e-09,2.63417801721126e-09,False,False,3.5,3.5, +coarse_interface_u,3,0.0,2.63417801721126e-09,2.63417801721126e-09,False,False,3.5,3.5, +coarse_interface_u,4,0.0,6.585443742795605e-08,6.585443742795605e-08,False,False,3.5,3.5, +coarse_interface_u,5,0.0,1.2644051067663912e-07,1.2644051067663912e-07,False,False,3.5,3.5, +coarse_interface_u,6,2.123413592043705e-07,1.4528626697542904e-07,3.5762762617979955e-07,False,False,20.5,12.5, +coarse_interface_u,7,4.0664670353703905e-06,2.0116559817931723e-07,4.267265792606936e-06,True,True,20.5,13.5, +coarse_interface_u,8,2.316397368189694e-05,1.5646213891164667e-07,2.3320343327342335e-05,True,True,20.5,13.5, +coarse_interface_u,9,6.795742008554701e-05,1.5646213891164667e-07,6.81138583592495e-05,True,True,20.5,13.5, +coarse_interface_u,10,0.00013453387391202865,9.750014426779573e-08,0.00013463070833560589,True,True,20.5,13.5, +coarse_interface_u,11,0.00020315493961354394,1.1795114315203827e-07,0.00020326776624343072,True,True,20.5,13.5, +coarse_interface_u,12,0.0002578325145358002,7.455233297611785e-08,0.00025790659921174714,True,True,20.5,14.5, +coarse_interface_u,13,0.0002848355625376438,3.83541997932092e-08,0.0002848672209318115,True,True,20.5,14.5, +coarse_interface_u,14,0.00028850325159438407,3.003423681142711e-08,0.00028847339892346693,True,True,20.5,15.5, +coarse_interface_u,15,0.0002790426599299092,6.516592454722021e-08,0.00027900289954439403,True,True,20.5,16.5, +coarse_interface_u,16,0.0002656231695763881,1.006517304071618e-07,0.0002656687325338991,True,True,20.5,17.5, +coarse_interface_u,17,0.00025167224259872663,9.86322156278415e-08,0.00025171418857411254,True,True,20.5,18.5, +coarse_interface_u,18,0.00023917435962541014,1.0286787296380317e-07,0.00023916330914968713,True,True,20.5,19.5, +coarse_interface_u,19,0.0002264648202014007,7.783088195871973e-08,0.00022649832134267317,True,True,20.5,20.5, +coarse_interface_u,20,0.00021450009842274482,8.503127640307697e-08,0.0002145262119900782,True,True,20.5,20.5, +coarse_interface_u,21,0.00019565444290966713,7.893743237430962e-08,0.00019572665753668725,True,True,20.5,20.5, +coarse_interface_u,22,0.00017530342242023255,5.2749351285234925e-08,0.0001753561669734725,True,True,20.5,20.5, +coarse_interface_u,23,0.00016284198169591366,8.178685339035058e-08,0.00016288798599953632,True,True,20.5,14.5, +coarse_interface_u,24,0.00016001299284349154,6.715860617082587e-08,0.00016005458983486885,True,True,20.5,14.5, +coarse_bulk_u,1,0.0,0.0,0.0,False,False,0.5,0.5, +coarse_bulk_u,2,0.0,0.0,0.0,False,False,0.5,0.5, +coarse_bulk_u,3,0.0,0.0,0.0,False,False,0.5,0.5, +coarse_bulk_u,4,0.0,0.0,0.0,False,False,0.5,0.5, +coarse_bulk_u,5,0.0,0.0,0.0,False,False,0.5,0.5, +coarse_bulk_u,6,0.0,0.0,0.0,False,False,0.5,0.5, +coarse_bulk_u,7,9.685747920378016e-08,2.12341462371735e-07,3.0919894157551517e-07,False,False,21.5,12.5, +coarse_bulk_u,8,1.885523449607647e-06,2.458690369633922e-07,2.131116250194691e-06,True,False,21.5,13.5, +coarse_bulk_u,9,1.1801222962468464e-05,1.564621179284487e-07,1.1957591962850096e-05,True,True,21.5,13.5, +coarse_bulk_u,10,3.7763148161723895e-05,1.0327184058071679e-07,3.786536052602384e-05,True,True,21.5,13.5, +coarse_bulk_u,11,8.290997527773004e-05,4.214683516511236e-08,8.293984645156337e-05,True,True,21.5,13.5, +coarse_bulk_u,12,0.00013975592467875463,5.890198697622995e-09,0.00013975397806857782,True,True,21.5,13.5, +coarse_bulk_u,13,0.00019498935130707817,4.806920811870088e-08,0.00019495727755690072,True,True,21.5,14.5, +coarse_bulk_u,14,0.00023699059195898703,3.215422633434082e-08,0.00023698211801486242,True,True,21.5,14.5, +coarse_bulk_u,15,0.000255587117158192,3.434546877545681e-08,0.0002555629409290573,True,True,21.5,14.5, +coarse_bulk_u,16,0.00025699080829703886,0.0,0.00025699080829703886,True,True,21.5,15.5, +coarse_bulk_u,17,0.00024815159847585574,6.606481633104396e-08,0.0002482080995082901,True,True,21.5,16.5, +coarse_bulk_u,18,0.00023639704637690832,6.929437569595666e-08,0.00023645799303108044,True,True,21.5,17.5, +coarse_bulk_u,19,0.00022522644482484474,1.0390817551817351e-07,0.00022530812767909556,True,True,21.5,19.5, +coarse_bulk_u,20,0.0002151574621150763,1.042082306083734e-07,0.00021524519922552202,True,True,22.5,18.5, +coarse_bulk_u,21,0.00020618043430475382,9.442706670805767e-08,0.00020625960942046836,True,True,21.5,20.5, +coarse_bulk_u,22,0.0001977039381507293,5.556802130737047e-08,0.00019775833634301496,True,True,22.5,20.5, +coarse_bulk_u,23,0.00018973381549205,4.4703464263670685e-08,0.00018970107840731907,True,True,22.5,21.5, +coarse_bulk_u,24,0.00018031585591623997,9.995996742145265e-08,0.0001802207328329628,True,True,22.5,22.5, +fine_band_neq,1,0.0,3.000928300994632e-09,3.000928300994632e-09,False,False,4.25,4.25, +fine_band_neq,2,0.0,4.501393077727123e-09,4.501393077727123e-09,False,False,4.25,4.25, +fine_band_neq,3,0.0,2.069606169774474e-08,2.069606169774474e-08,False,False,4.25,4.25, +fine_band_neq,4,0.0,4.1392115429639276e-09,4.1392115429639276e-09,False,False,4.25,4.25, +fine_band_neq,5,0.0,4.1392115429639276e-09,4.1392115429639276e-09,False,False,4.25,4.25, +fine_band_neq,6,3.8661114470928126e-07,9.934099098884985e-09,3.766770456103963e-07,True,True,19.75,13.25, +fine_band_neq,7,2.0898831959437203e-06,9.934099098884985e-09,2.0799490968448353e-06,True,True,19.75,13.25, +fine_band_neq,8,5.086951299526632e-06,9.934099098884985e-09,5.077017200427747e-06,True,True,19.75,13.75, +fine_band_neq,9,7.3187303596400355e-06,1.1589783133203468e-08,7.307140576506832e-06,True,True,19.75,14.25, +fine_band_neq,10,7.498180437826019e-06,9.106256526614231e-09,7.489074181299404e-06,True,True,19.75,15.25, +fine_band_neq,11,6.85740365241605e-06,5.794905943989903e-09,6.86319855836004e-06,True,True,19.75,17.25, +fine_band_neq,12,6.20376639004494e-06,6.622735776451449e-09,6.200455026694751e-06,True,True,19.75,18.25, +fine_band_neq,13,5.366229072267803e-06,4.139212333997833e-09,5.369540443278531e-06,True,True,19.75,19.25, +fine_band_neq,14,5.300103189165295e-06,4.967056432825245e-09,5.30507024559812e-06,True,True,19.75,19.75, +fine_band_neq,15,4.0156351262532475e-06,4.553132745832578e-09,4.018946498263176e-06,True,True,19.75,19.75, +fine_band_neq,16,3.7773208383384826e-06,6.622738135675377e-09,3.783943576474158e-06,True,True,19.75,16.75, +fine_band_neq,17,3.59763095919563e-06,6.622736969941201e-09,3.598458797438031e-06,True,True,19.75,17.75, +fine_band_neq,18,3.1864885083332517e-06,1.7384672978959514e-08,3.2038731813122112e-06,True,True,19.75,18.75, +fine_band_neq,19,3.2079558324737967e-06,9.934106745546067e-09,3.2054722903795962e-06,True,True,19.75,19.75, +fine_band_neq,20,3.2478981990546885e-06,8.278412177986638e-09,3.256176611232675e-06,True,True,19.75,19.75, +fine_band_neq,21,2.8408409309954585e-06,1.1589792486832451e-08,2.83256250521724e-06,True,True,19.75,19.75, +fine_band_neq,22,2.2599308021065134e-06,1.241763983306221e-09,2.2599308009962904e-06,True,True,19.75,19.75, +fine_band_neq,23,1.7067130013148635e-06,2.0696062086322797e-09,1.7075408424993554e-06,True,True,19.75,19.75, +fine_band_neq,24,1.7691307190870198e-06,7.864502313270627e-09,1.768302879068262e-06,True,True,4.25,8.25, +transfer_neq,1,0.0,1.5004641487625925e-09,1.5004641487625925e-09,False,False,3.5,3.5,6 +transfer_neq,2,0.0,3.000928290586291e-09,3.000928290586291e-09,False,False,3.5,3.5,6 +transfer_neq,3,0.0,3.000928290586291e-09,3.000928290586291e-09,False,False,3.5,3.5,6 +transfer_neq,4,0.0,6.881438113781613e-09,6.881438113781613e-09,False,False,3.5,3.5,6 +transfer_neq,5,0.0,6.467520081987477e-09,6.467520081987477e-09,False,False,3.5,3.5,6 +transfer_neq,6,4.801482146599145e-08,1.7384695072397705e-08,3.063012639359375e-08,False,False,20.5,12.5,1 +transfer_neq,7,9.917490157301811e-07,1.4901174696935193e-08,9.76847841033246e-07,True,True,20.5,13.5,1 +transfer_neq,8,5.3319513640959215e-06,7.450589978308386e-09,5.324500774117613e-06,True,True,20.5,13.5,1 +transfer_neq,9,1.3926900000016396e-05,4.967061900673642e-09,1.3921932938115722e-05,True,True,20.5,13.5,1 +transfer_neq,10,2.2683459353481372e-05,7.0366557441969846e-09,2.269049600922557e-05,True,True,20.5,13.5,1 +transfer_neq,11,2.6366830318105827e-05,8.692339972804497e-09,2.6375522658078632e-05,True,True,20.5,14.5,1 +transfer_neq,12,2.307753771932375e-05,1.0761948318616099e-08,2.3088299667642365e-05,True,True,20.5,14.5,1 +transfer_neq,13,1.804053278801898e-05,6.6227364148296886e-09,1.804715552443381e-05,True,True,16.5,20.5,3 +transfer_neq,14,1.3273871487681776e-05,3.725288785783043e-09,1.327759677646756e-05,True,True,17.5,20.5,3 +transfer_neq,15,1.109810416584367e-05,1.7074248230553035e-09,1.1096396741020614e-05,True,True,20.5,20.5,5 +transfer_neq,16,1.0547037354428218e-05,3.777030622292843e-09,1.0550814385050511e-05,True,True,20.5,20.5,5 +transfer_neq,17,7.76073680465103e-06,1.5522043823879006e-09,7.762289009033418e-06,True,True,20.5,20.5,5 +transfer_neq,18,6.477044739522375e-06,2.4835230261199825e-09,6.479528262548495e-06,True,True,16.5,3.5,4 +transfer_neq,19,6.888961226400592e-06,4.553130164564045e-09,6.893514356565156e-06,True,True,16.5,3.5,4 +transfer_neq,20,8.081834403372845e-06,1.6556842147297246e-09,8.080178719158115e-06,True,True,3.5,15.5,2 +transfer_neq,21,9.19306995308955e-06,4.553133203799575e-09,9.19762308629335e-06,True,True,3.5,15.5,2 +transfer_neq,22,9.90222802181584e-06,1.241762831449833e-09,9.90346978464729e-06,True,True,3.5,15.5,2 +transfer_neq,23,9.820215213826589e-06,3.725291089495819e-09,9.823940504916084e-06,True,True,3.5,16.5,2 +transfer_neq,24,9.034586770997888e-06,6.208816516473092e-09,9.028377954481415e-06,True,True,3.5,17.5,2 diff --git a/research/fine_surface_joint_20261014/blow_signals.npz b/research/fine_surface_joint_20261014/blow_signals.npz new file mode 100644 index 0000000000000000000000000000000000000000..528adf75baa2f84b84bbe09d0edeb2de4d3512fe GIT binary patch literal 221114 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

N`-`1!7TxXll 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 literal 0 HcmV?d00001 diff --git a/research/fine_surface_joint_20261014/blow_summary.json b/research/fine_surface_joint_20261014/blow_summary.json new file mode 100644 index 0000000..32285ac --- /dev/null +++ b/research/fine_surface_joint_20261014/blow_summary.json @@ -0,0 +1,170 @@ +{ + "speed": 0.002, + "initial_leaf": [ + 560.7500041779131, + 0.0, + 0.0 + ], + "final_leaf": [ + 560.8438616539352, + 0.014835720416158438, + 0.012527641374617815 + ], + "raw_residual": [ + 0.0002896524965763092, + 8.014030754566193e-06, + 4.828907549381256e-06 + ], + "exact_average_residual": [ + 0.00028958916664123535, + 7.874332368373871e-06, + 4.7245994210243225e-06 + ], + "cumulative": { + "boundary": [ + 0.09356788685545325, + 0.014827846083790064, + 0.01252291677519679 + ], + "fine_transfer": [ + -0.0672332551330328, + -0.01191190630197525, + -0.010114157572388649 + ], + "coarse_transfer": [ + 0.06723319180309772, + 0.011911766603589058, + 0.010114053264260292 + ], + "rounding": [ + 0.0002896524965763092, + 8.014030754566193e-06, + 4.828907549381256e-06 + ], + "average": [ + -6.332993507385254e-08, + -1.3969838619232178e-07, + -1.043081283569336e-07 + ] + }, + "checks": { + "validity": true, + "geometry_unchanged": true, + "boundary_count": 48, + "collision_count": 72, + "local_collision": true, + "local_regime": true, + "bfl": true, + "transfer_rounding": true, + "interval_closure": true, + "cumulative_closure": true, + "propagation": true, + "drive_sign": true + }, + "max_collision_ratio": 0.5696050037738337, + "max_collision_error": 1.5865499780609582e-07, + "max_bfl_error": 1.2725840020655355e-08, + "max_interval_closure": 0.0, + "drive_mass": 0.07436401406617413, + "propagation": { + "coarse_interface_u": { + "threshold": 1e-06, + "baseline_factor": 10, + "first_arrival": { + "time": 7, + "signal": 4.0664670353703905e-06, + "baseline": 2.0116559817931723e-07, + "absolute": 4.267265792606936e-06, + "x": 20.5, + "y": 13.5 + }, + "peak": { + "metric": "coarse_interface_u", + "time": 14, + "signal": 0.00028850325159438407, + "baseline": 3.003423681142711e-08, + "absolute": 0.00028847339892346693, + "any_crossed": true, + "peak_crossed": true, + "x": 20.5, + "y": 15.5 + } + }, + "coarse_bulk_u": { + "threshold": 1e-06, + "baseline_factor": 10, + "first_arrival": { + "time": 8, + "signal": 1.1069172403255332e-06, + "baseline": 1.005827957173589e-07, + "absolute": 1.2074577299858699e-06, + "x": 13.5, + "y": 21.5 + }, + "peak": { + "metric": "coarse_bulk_u", + "time": 16, + "signal": 0.00025699080829703886, + "baseline": 0.0, + "absolute": 0.00025699080829703886, + "any_crossed": true, + "peak_crossed": true, + "x": 21.5, + "y": 15.5 + } + }, + "fine_band_neq": { + "threshold": 1e-07, + "baseline_factor": 10, + "first_arrival": { + "time": 6, + "signal": 3.8661114470928126e-07, + "baseline": 9.934099098884985e-09, + "absolute": 3.766770456103963e-07, + "x": 19.75, + "y": 13.25 + }, + "peak": { + "metric": "fine_band_neq", + "time": 10, + "signal": 7.498180437826019e-06, + "baseline": 9.106256526614231e-09, + "absolute": 7.489074181299404e-06, + "any_crossed": true, + "peak_crossed": true, + "x": 19.75, + "y": 15.25 + } + }, + "transfer_neq": { + "threshold": 1e-07, + "baseline_factor": 10, + "first_arrival": { + "time": 7, + "signal": 9.917490157301811e-07, + "baseline": 1.4901174696935193e-08, + "absolute": 9.76847841033246e-07, + "q": 1, + "x": 20.5, + "y": 13.5 + }, + "peak": { + "metric": "transfer_neq", + "time": 11, + "signal": 2.6366830318105827e-05, + "baseline": 8.692339972804497e-09, + "absolute": 2.6375522658078632e-05, + "any_crossed": true, + "peak_crossed": true, + "q": 1, + "x": 20.5, + "y": 14.5 + } + } + }, + "raw_minus_zero": [ + 6.053410470485687e-05, + 2.1085143089294434e-06, + 9.126961231231689e-07 + ] +} diff --git a/research/fine_surface_joint_20261014/command.txt b/research/fine_surface_joint_20261014/command.txt new file mode 100644 index 0000000..510ecb2 --- /dev/null +++ b/research/fine_surface_joint_20261014/command.txt @@ -0,0 +1,2 @@ +/home/frank14f/anaconda3/envs/pycuda_3_10/bin/python /home/frank14f/CelerisLab/research/fine_surface_joint_20261014/runner.py +Child command, explicit environment, fresh resource preflight and actual exit are stored in gpu_run.json. diff --git a/research/fine_surface_joint_20261014/criteria.txt b/research/fine_surface_joint_20261014/criteria.txt new file mode 100644 index 0000000..dd36e76 --- /dev/null +++ b/research/fine_surface_joint_20261014/criteria.txt @@ -0,0 +1,110 @@ +FROZEN BEFORE GPU — bounded fine-surface/interface validation, 2026-10-14 + +Scope: exactly three independent trajectories speed=0,+.002,-.002, each24 +coarse/48fine steps, same physical time[0,24]. No other GPU tests, extensions, +parameter sweeps or time extensions. Read-only hook instrumentation of normal +production build, no audit macro and no stepping/formula changes. + +Geometry: periodic24x24 coarse domain; patch edge bounds[4,20)x[4,20); +fine40x40 including4halo; origin edge(2,2); fine dx=dt=.5; coarse dx=dt=1. +Circle physical center(12.25,12.25),radius2.15 => fine integer center(20,20),R4.3. +Stationary solid; surface angle.7rad,half_width.85rad,C1 amplitude0,+/-.002. +nu_coarse=.05,tau_coarse=.65,tau_fine=.8; unforcedD2Q9SRT,FP32,unshiftedDB. +Initial rho1,u0,Q-major postcollision equilibrium, same FP32 initial populations. +All initial sources and device omega are checked. Actual package path must be +/home/frank14f/CelerisLab/src. The preserved old tests are not changed or run. + +Validity at every fine/coarse hop and publication: +All valid fluid leaves finite, density(.9,1.1) and |u|<.05 in local collision +oracle validity regime. Fine solids and outermost2halo after each fine hopNaN; +inner ghost exactly stream-only including legitimate directionalNaNs. +Published fine ghost/solid and coarse coveredNaN. Geometry and flags unchanged. + +Propagation definitions (strict >; horizons and masks never adjusted): +- Fine band: fine active fluid nodes with any D2Q9 nonrest neighbor outside + geometric active patch, excluding solid boundaries. +- Coarse interface: uncovered receiver cells of actual coalescence map. +- Coarse bulk: ALL uncovered coarse fluid except that interface receiver set. +- Transfer neq: actual replaced q component of the full reconstructed coarse + incoming vector minus FP64feq(rho,u) of that same incoming vector, BEFORE + coarse collision. Do not form full macros from partly valid ghost children. +- Fine band neq: postcollision g minus FP64 equilibrium from its own macros. +- Velocities: FP64 moments of published postcollision g / rho. +- Physical coordinate coarse(I+.5,J+.5);fine(2+.5*(i+.5),2+.5*(j+.5)). + Interface transfer and publication sampled at integer physical t=1..24. + Boundary substeps at t=n-.5,n; no claim of sub-integer arrival resolution. +- At each same point/q,time,phase compare driven and ZERO trajectory: + velocity norm difference>1e-6 AND >10*zero velocity norm; + neq absolute difference>1e-7 AND >10*abs(zero neq). + Fine-band criterion uses maxq at each node for BOTH signal/baseline; this + conservatively requires excess over the largest zero neq at that node. +- For BOTH signs, all4 metrics (fine-band neq, actual-transfer neq, + coarse-interface velocity, coarse-bulk velocity) must cross by24 or FAIL. + Record each first qualified sample and global peak's time,physicallocation, + baseline,absolutevalue,signal; per-step maxima and qualifying flag retained. + These are aligned signal witnesses, not necessarily the same node/direction. + This tests startup distribution/macroscopic propagation, possibly acoustic; + not established jet advection, physical accuracy or shear-only transmission. + +Ledger (M maps9populations to mass,px,py; area weights coarse1,fine1/4): +L_n=M(sum coarse leaves+1/4 sum fine fluid leaves), FP64 accumulation. +Each of48fine hops individually captures pre-BFL and staged BFL populations. +B_h=1/4 M(actual solid-to-fluid arrivals minus fluid-to-solid departures). +F_h=1/4 M(actual ghost-to-fluid arrivals minus fluid-to-ghost departures). +B_n=B_h1+B_h2; F_n=F_h1+F_h2. No using latest buffer as two-hop sum. +C_n=M(actual reconstructed coarse incoming minus previous coarse leaves), +including periodic native streaming, all replacement links and8grazingcorners. +Coarse incoming constructed from independent physical midpoint map; compare +all target/source slots to actual tables. avg32=.25*((a+b)+c+d) inFP32. +RAW_n=L_n-L_(n-1)-B_n-F_n-C_n; cumulative raw uses same initial/final leaves. +Report RAW and driven-minus-zero RAW FIRST, never call them corrected to zero. + +Source-based rounding decomposition and separate fixed checks: +1. Each fine/coarse collision: reconstruct actual FP32 input using pure pull + and avg32 where applicable. Independently evaluate FP64 SRT at the actual + device FP32omega, verifying omega against tau and force=0. + Every q,node must obey |GPUout-SRT64(input)| <= 8*eps32*|input_q|. + This fixed local, near-rest acceptance bound reflects short FP32 rho/macro/ + feq/FMA path and fast-math compilation; it is not a general roundoff theorem. + Report max absolute error and max normalized ratio, and fail if ratio>1. + Cround = weighted sum M(GPUout-input) measured LOCALLY, independently of L + or RAW. Record FP64 ideal moment defect and measured GPUout-ideal separately. + Arbitrary collision error cannot be excused solely by global closure. +2. Transfer Tround=M(avg32-avg64exact), computed independently from actual4 + children. Require each slot <=gamma3*sum|children|/4, u=eps32/2, + gamma3=3u/(1-3u); exact power-of-two scaling in this normal positive regime. + avg32 already in C_n, so DO NOT subtract Tround a second time. + Also report RAW_exact_average=RAW+Tround to expose this source explicitly. +3. BFL local oracle abs error<=1e-7, actual active cells unchanged. +4. |RAW_n-Cround_n|<=1e-10 componentwise per interval; + |sum RAW-sum Cround|<=1e-9 cumulative. These are FP64 bookkeeping bounds, + NOT a physical-conservation/accuracy test. No broad eps*whole-domain + accumulated budget used to label raw conservation as passing. +5. Both driven cases' cumulative actual-minus-passive-oracle boundary mass + has same sign as specified normal speed. BFL passive evaluated on same + actual populations; not another trajectory and not a conservation fix. + +Saved data: pertrajectory24ledger rows,72local collision rows,48fine boundary +rows; small compressed diagnostic signals for reproducible zero comparisons; +no full-field populations. Per-step link_exchange_GPU also saved separately: +latest fine Fx,Fy scaled1/4; torque scaled1/8 for physical lever length. These +body momentum diagnostics differ from fluid mass exchange and are NOT thrust +or exchange rate. A fine-hop fluid exchange rate is B_h/.5; the coarse interval +rate is (B_h1+B_h2)/1, numerically equal to interval sum only because dt_c=1. +Do not equate B_h2/latest with two-hop interval sum. + +No post-result tolerance/formula/window changes, retries or added steps to +chase PASS. Preserve errors with real stdout/exit. Report precise unmet checks. +Resource guards: fresh physicalGPU0UUID/apps/VRAM/RAM, onlyGPU0ifidle; no +other task interference; 180secondwalltimeout; current available RAM reserve +max(4GiB,10%),VRAM reserve max(512MiB,10%), own temporary+evidence<=2GB. +Sample own process group RSS, no fixed address-space/RSS cap; remove only owned +scratch. Every text artifact<=40000characters. Hash criteria/script/source at +freeze then verify before launch; preserve all previous dirty/evidence. + +Reference trace: accepted local tests/test_fine_surface_gpu.py BFL/flux hooks; +refinement.cu actual two fine hops and coalesce order; macro.cuh and +collision_srt.cuh actual FP32 collision path; compiler_v2.py --use_fast_math. +Previously accepted OpenLB defineU2D.hh74-79/offBoundaryPostProcessors2D.hh115-127 +remain BFL hit/stencil reference; no new CFD formula or borrowed code. +Production change limited to one coordinate-frame documentation sentence. diff --git a/research/fine_surface_joint_20261014/frozen.json b/research/fine_surface_joint_20261014/frozen.json new file mode 100644 index 0000000..b5a3324 --- /dev/null +++ b/research/fine_surface_joint_20261014/frozen.json @@ -0,0 +1,105 @@ +{ + "frozen_utc": "2026-10-14T05:55:03.221284+00:00", + "hashes": { + "src/CelerisLab.egg-info/PKG-INFO": "0b9a8a4e8d60bc531473688723ddef0aab02c7ccc4997e31c9b6a6c35011ca77", + "src/CelerisLab.egg-info/top_level.txt": "cd51958ca03afabbaa9618c60b8280e486f8cc0b0359b839e10f886e7c3948f8", + "src/CelerisLab.egg-info/dependency_links.txt": "01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b", + "src/CelerisLab.egg-info/requires.txt": "36e1404178e5ea590b2fc04e8ba4d748ec9a82e7693136ccf0dfd204fe265c04", + "src/CelerisLab.egg-info/SOURCES.txt": "f36b29c1b34c4bd6b2acc3ccdd21c24ee5077df7e2a20a652d9fae77eedb8e21", + "src/CelerisLab/simulation.py": "c9d903f53fe356d7af281bea07943de1a62494127fb69848d7053fd46f7dec3e", + "src/CelerisLab/config.py": "2f1bba7515f5bc08cb3a8d140bcafe7fa0689e01b3b06494697bb2956a71530e", + "src/CelerisLab/__init__.py": "21cc469bd6e970a1f9ff5970c8eea4602065e41fc881854759ee565ee55c10c6", + "src/CelerisLab/cuda/compiler_v2.py": "c4cc3ec4445c8d75e6a253dd87963877117a722bc73b9d4811806fc6045d08c1", + "src/CelerisLab/cuda/obs_layout.py": "5ffb2c3aeeaaaaeb64f2cd8febfbcf4ad9919e5414020ad753cfade0683b21c2", + "src/CelerisLab/cuda/context.py": "013dd4ec6d01d2fbd11afdfb103eac6a273bd9f798d663d761b851eeb27885e9", + "src/CelerisLab/cuda/__init__.py": "0d01dff9f0399c8baba822aab5ca0122a135f011008ed8a499ebd9f7e5b06aea", + "src/CelerisLab/lbm/refinement_stepper.py": "6aad7f66e4288e293b30b2f9712202447686f263fab41150f5d919cc64328d06", + "src/CelerisLab/lbm/field.py": "0e727eacc3706add4d8d15c418e9b631050871f831698d3ac689dd5f2c701b9b", + "src/CelerisLab/lbm/equilibrium.py": "2fb2f2bb7ff326d23abce80fc2a4c0907b17740ea3e29fe6ae079c5044783826", + "src/CelerisLab/lbm/descriptors.py": "c9f025dfc14da43b989047b84cc22bd05d5cc92c9ec695c1da68fdfb788e3f2b", + "src/CelerisLab/lbm/initializers.py": "dacf9586963e862d6d0a98ef1a066036be6f91e9d423720661d8ef2c1fb2df6a", + "src/CelerisLab/lbm/curved_links.py": "00d9c29d660b41190f32dd737b12f60e10ce4214b6c9a6ab2a63438813faa594", + "src/CelerisLab/lbm/stepper.py": "0dcb7cd7ae87e33e3dc67a38b6aa43042fbe673e37d9ad165342ee1d695933ce", + "src/CelerisLab/lbm/__init__.py": "7f60fb3aaae81501b510d08c2fedff44fcb05657260eb10b6f5cc91e7204306b", + "src/CelerisLab/lbm/refinement.py": "8935b070ec9e7020897919c15f43f7fa6293f02e2ff64a19a3e3d99bc444dbcc", + "src/CelerisLab/lbm/kernels/kernel_v2.cu": "c7bd3fb705b77261ba2441c52a24a7e6a7865c165cba088a1b75201c4d29c408", + "src/CelerisLab/lbm/kernels/refinement.cu": "129f3d91da93b4324f88a0da73a4da1e5390f72c14cce574ee63306712da9895", + "src/CelerisLab/lbm/kernels/config.h": "7d1124125e0b354558297934460e64c760fb68cdd7bf6d01a1238bb2eaab8c37", + "src/CelerisLab/lbm/kernels/kernel_v2.ptx": "a599ee30ae66800f4d4220eb79dfed35ff32991661260f01ea58023ef780f0ca", + "src/CelerisLab/lbm/kernels/operators/turbulence_smag.cuh": "ff7f000297ee0817e255ad9fcb6a13b647e3ddd5b206518d35f38d2895a9f501", + "src/CelerisLab/lbm/kernels/operators/collision_mrt.cuh": "aee444eb60c47a3fd518dca975d1af05425a0818a0ec6c3fb3f6150f60c2cb44", + "src/CelerisLab/lbm/kernels/operators/collision_trt.cuh": "9725b9840b9ad8b4ec7be61ff5d06d3151e86d1a87585c13f2fbf934d0d2c5f6", + "src/CelerisLab/lbm/kernels/operators/collision_srt.cuh": "6b7ff842f392c8f853d2d1a97cc69bfe50f21283f73e659404da07cf6c95f5e1", + "src/CelerisLab/lbm/kernels/operators/forcing_guo.cuh": "969a430c1af03f32e3bd0df95d805e64f56334717c44dd4ba208ba503062a24b", + "src/CelerisLab/lbm/kernels/operators/macro.cuh": "e27c1c410dc857be98da4596568e405eeaf88701d291ac0e398aa9cd23dee740", + "src/CelerisLab/lbm/kernels/operators/helpers.cuh": "0b3a4d95d7d19f5fec09e5423b8f4cc99f8a226b541967425967330da5a051ec", + "src/CelerisLab/lbm/kernels/core/precision.cuh": "849df14b4cce50af52399e4b8f3e997196f3ae5f1163f68e28df3e6b2507a8c4", + "src/CelerisLab/lbm/kernels/core/descriptors.cuh": "8440bc14857da9007982650f828a23608eec9f7cc4bf772e8c8dc1239cb45356", + "src/CelerisLab/lbm/kernels/core/obs.cuh": "b742b77c9f61e1f020fe9922c3838ae9d855e17b381154958b58f10a22938922", + "src/CelerisLab/lbm/kernels/core/params.cuh": "6e18bf730d936d940e3d85452f0714a2eaae31bf41002f9fd520ec5b372878dd", + "src/CelerisLab/lbm/kernels/core/flags.cuh": "0025705f24710330d9d9195f713879bfb650a85a3449baef0e196b831af104ab", + "src/CelerisLab/lbm/kernels/core/layout.cuh": "1fbd820021c89ac3efcde24145996cb0147769e607e498e61f308ed3e0b13706", + "src/CelerisLab/lbm/kernels/boundary/ibm_kernels.cuh": "e6909b547dc8d64cdd8a76a90660243a8f5fee535caa161b52b4dd8b7c29934b", + "src/CelerisLab/lbm/kernels/boundary/planar_velocity.cuh": "0b2f9e0bd483c199637e5672dc0ffc460bc383dd1804805befbeb4c5d8c708d1", + "src/CelerisLab/lbm/kernels/boundary/inlet_outlet.cuh": "de8b213a6da42c2e5e9f8966199fc66ea4541b85144a90f3f5dbad3c6ab63b97", + "src/CelerisLab/lbm/kernels/boundary/curved_boundary.cuh": "7bccf7e7091c012d7a3d4874a881d4d46699021faedd83d125933fbdaa562711", + "src/CelerisLab/lbm/kernels/boundary/bounce_back.cuh": "aba3748c564ed91b161d268ef8b737b7c7be96a823063d201f3da684dd845233", + "src/CelerisLab/lbm/kernels/boundary/esopull_curved_helpers.cuh": "b9b474bc4edaff05681c5443235472d04072d0d775fc0eb9c5967faef52b0258", + "src/CelerisLab/lbm/kernels/boundary/inlet/equilibrium.cuh": "f0964c811b2c41a5aaa1c6d99c490b06e850c634eb8749f1f05ef61f93c2de1d", + "src/CelerisLab/lbm/kernels/boundary/inlet/channel_stabilized.cuh": "efe077afcbb6b731256a987c2fd79a1dbc470c902f87070d60421ea6cb13d4e2", + "src/CelerisLab/lbm/kernels/boundary/inlet/common.cuh": "f3cec54c8873c65b3dca4375605d2c89a8727765884d3954c235242fdff9c6ba", + "src/CelerisLab/lbm/kernels/boundary/inlet/zou_he_local.cuh": "e73e66b853b1e4e0e30d8f4185d832aa414ce670a1813ce2b5459f2887f71f89", + "src/CelerisLab/lbm/kernels/boundary/inlet/regularized.cuh": "943d4a571818bacb89c70bccfaac202691121e3e385803ce6309123a0a03ddaf", + "src/CelerisLab/lbm/kernels/boundary/outlet/pressure_neq.cuh": "c8b2adc66d12fe602076ddc9693c5c208711fcaddb58aa9a31401a269f51c4c4", + "src/CelerisLab/lbm/kernels/streaming/esopull_single_buffer.cuh": "77ed4ab9a0ebc5ff62a91a7c39066ef395391ae36e9040a69fb2bd8b1626dc79", + "src/CelerisLab/lbm/kernels/streaming/pull_double_buffer.cuh": "b65d741ed78b7b62f99531ba0c0ce1936663d8dc9640e7d7d16c707f1baf6549", + "src/CelerisLab/lbm/kernels/streaming/esopull_semantic_helpers.cuh": "dd5a9091628b079efd97e53fd49e52d09dcee88529235db77a5648e02937af6e", + "src/CelerisLab/lbm/kernels/step/curved_double.cu": "bfa7a1df1e939020314d49755045f7a85fe4a19cc1c68dbe62653c66c5e7c2b3", + "src/CelerisLab/lbm/kernels/step/esopull_sync.cu": "c0ff3e72900c3ab89a05dd03684e96d3b740cf1672d565727fc2af165933d087", + "src/CelerisLab/lbm/kernels/step/init_flow.cu": "305be3bb12fc0d039acec1701baabcf0e8a35e683c49c34f2af8ca9867d2b29c", + "src/CelerisLab/lbm/kernels/step/esopull_macro.cu": "c73116020ca217ede1e4de27c8269c31f9d91e33433ac8252a21e9b14187c50f", + "src/CelerisLab/lbm/kernels/step/aux_kernels.cu": "578a5b20a157241ee678547059abb1372dd5a589ad06bb2c15b987eb01ca1013", + "src/CelerisLab/lbm/kernels/step/one_step_esopull.cu": "aa223b2744ae6c9125673df311a96ce588032c1ba58bebb11fd33ecb990f8ed4", + "src/CelerisLab/lbm/kernels/step/one_step_double.cu": "f9f8242b38e8e0cf8425b75e2b0215bc15363c62eaa0fb43c761b8e0931bfdc9", + "src/CelerisLab/lbm/kernels/config/config_physics.h": "26df33c2960ba36f3283e19b55b4ea92e50e4efda705f9ebfbf3f875a4092c59", + "src/CelerisLab/lbm/kernels/config/config_method.h": "3db4e16ef2c6b22349d04e6aa8ab04bdfe0eb784f9f3a98277e15dbed1835d81", + "src/CelerisLab/lbm/kernels/config/config_grid.h": "8be3a7cf74ba30d7fd3074fed79e63dbda7311c4d03b454ea641bf298ffeaa8d", + "src/CelerisLab/lbm/kernels/config/config_objects.h": "dbb93c063586da278c15d95e23f84c12e728f4f5f1bbc3980fe9cedaa6fff90e", + "src/CelerisLab/lbm/kernels/config/config_obs.h": "c11e2249359145b5c4cbaaf0487506fa77c1f4b82c7c169ddc574aa0babcd727", + "src/CelerisLab/common/checkpoint.py": "b2f960aecd5ac27a3a7130b809ffad4709c44d522edef0359ab952654625410b", + "src/CelerisLab/common/_types.py": "aad2ff1a9033d4fd68783ad7123afb47201ddc58785cb6dc0246947037072a5f", + "src/CelerisLab/common/pathline.py": "a1b6efcc0a076d0f1dc8d49a595779426d7d5626b00072a59bac710ff02ad046", + "src/CelerisLab/common/__init__.py": "d4dbde78bc97fccc9eabac9abae8f0f15c112c10ff8e9b45bd9401d4723df1ef", + "src/CelerisLab/common/preprocess.py": "7fc78a08857cf8e98519500b094a1d896af189b6b15658ff9b388ed51bed4515", + "src/CelerisLab/common/render.py": "0e055476257eb2bcd11e733766e52195de02f8fad228f570a3511a7c831bdc29", + "src/CelerisLab/common/streakline/_render.py": "236cd637414ee318c4d66f9aed32110d8dc42a100d65fde06172f7cd0ba62c65", + "src/CelerisLab/common/streakline/_integrate.py": "3fbd4368b2c8d0e7fda40dc65aac5df02b085008b4c68acd83cb7ae45d33a13b", + "src/CelerisLab/common/streakline/_streakline.py": "1a3e08daa706b5f83cdeb337e9a945a36ddf7583c40af1d0bb9d825ac954df37", + "src/CelerisLab/common/streakline/__init__.py": "13ff1cfa416fdd721a08a659e76b5a5a99b8d3201add10a83b7b0bc654bc1eec", + "src/CelerisLab/common/streakline/_config.py": "a9185ef68e9c7b5d5a1dc0b04a28341e2ad91d13c145a7c106636a878cf0a605", + "src/CelerisLab/configs/config_lbm.json": "17e4311f1f250c6ece59177a8b6ff856b69a016c7c10267e774b030a0a390865", + "src/CelerisLab/configs/CONFIG.md": "41cafdbe525366c08aa9d0416ea026ccf0026ba7123b8a9b65f968a80d928e3a", + "src/CelerisLab/configs/config_lbm_three_cylinder_triangle.json": "eeb8e7149dbe4aa6b3a9562802735aa950750dfbe2d972a0727e788573afa817", + "src/CelerisLab/configs/config_lbm_flume_trt_regularized.json": "f4bba8e6a4339fc3c4eb14f6e2f57c4b22993c73703c773d853edfbe34736e56", + "src/CelerisLab/configs/config_body.json": "055f261f0828ca1d4f2bb694bd15b72bbcabe31d552326208f28e37f761adab1", + "src/CelerisLab/configs/config_lbm_flume_mrt_zouhe.json": "8f593321db05a563a42931603a228d61cbcba06dfbe113262d5cd0ad93c0fe79", + "src/CelerisLab/body/objects.py": "d1cf7054cc8379a83c39acc66a7c88ae62fa004f110bb0c1def2ee57137401c5", + "src/CelerisLab/body/action_smoother.py": "b1a23ee6bbd4850b172cb8738c5c3546ee465a54189e6af9d8044f023d4687dc", + "src/CelerisLab/body/registry.py": "fbb7327780adbdc6da15ebdb799980daf32df22ee974af0893d7409f177bbb68", + "src/CelerisLab/body/manager.py": "6a40be708c71ef6f3b5f5f0aa9c92cfafc51f2ec2a958f99656cccb850986c16", + "src/CelerisLab/body/ddf_patch.py": "60fcfb7441e73bf290bcff41ca3a83da3e7ddad765d7247464e8f02e3043b4e2", + "src/CelerisLab/body/sync_plan.py": "a73ac9ee361b2120d0b7bbebeaa2ccbf924ba27bd95d4dd4b383c10a39b2a409", + "src/CelerisLab/body/__init__.py": "91d1155080b3ade83d13c84c39693046df122e4bed5ef583de2df1f9453c1b76", + "src/CelerisLab/body/preprocess/flag_overlay.py": "831fc9e9736b758847759a085ff133eb49ec91318ace4fda76f85960138ee300", + "src/CelerisLab/body/preprocess/__init__.py": "dfd9d58bc07f626ab23a70053e31b88a6d9165d2e4c76a4e9f48abe674d3d2ec", + "src/CelerisLab/body/geometry/base.py": "cceca14361ca2f34d34a3e43730e1a79b8ca81be00f0dd62e884db32b479419f", + "src/CelerisLab/body/geometry/__init__.py": "ada88980ab672959aca9aa3a4c4aade3219524b2ab68110cd2a2f41e3e0ca90a", + "src/CelerisLab/body/geometry/circle.py": "7605ca7c21103f1d801ac73ab8dd18dffbdac425b2dee7b8858b283628a9e436", + "src/CelerisLab/body/coupling/soa_packer.py": "8ec26fd55ef74801bbd5ab6bd3d0a7dabc750cbd498aaac2ca4c61a0108ad3c9", + "src/CelerisLab/body/coupling/__init__.py": "c931f7eb318d48408c3e2febcc6917c88c8dcc1697cbf4329b1f340d94c35763", + "tests/validation/multigrid/test_fine_surface_gpu.py": "d45ca48fc4e77d021fcc5461329b094ae11b257c036bb23634d326fbbedb7700", + "research/fine_surface_joint_20261014/validate.py": "346f1223daa7ce1fb376be5e921fec5ad77c3a10992806d54ececdf199e7c3ea", + "research/fine_surface_joint_20261014/runner.py": "2e52a6fd8306c07415c82d9275e17d58e0597ebd9f1f45b3be81dcdb005d4737", + "research/fine_surface_joint_20261014/criteria.txt": "d80d6f1218b3db449ea9115fa701b9173bc866929e634e2a3b17278b65f0c256" + } +} diff --git a/research/fine_surface_joint_20261014/gpu_run.json b/research/fine_surface_joint_20261014/gpu_run.json new file mode 100644 index 0000000..67ac478 --- /dev/null +++ b/research/fine_surface_joint_20261014/gpu_run.json @@ -0,0 +1,39 @@ +{ + "start_utc": "2026-10-14T05:55:16.773509+00:00", + "command": [ + "/home/frank14f/anaconda3/envs/pycuda_3_10/bin/python", + "/home/frank14f/CelerisLab/research/fine_surface_joint_20261014/validate.py" + ], + "cwd": "/home/frank14f/CelerisLab", + "physical_gpu_uuid": "GPU-e8853ae7-a302-6a17-bcfa-aa767e9ed20c", + "note": "Sampled guards, not an OS hard isolation; no fixed RSS/AS cap.", + "preflight_gpu": "0, GPU-e8853ae7-a302-6a17-bcfa-aa767e9ed20c, Tesla V100-SXM2-16GB, 5, 16140, 0\n1, GPU-f1c9fd5a-e917-56e0-21fb-24035ba44a36, Tesla V100-SXM2-16GB, 5, 16140, 0\n2, GPU-b8c11c01-c91f-aa0b-abf6-dad35085cc76, Tesla V100-SXM2-16GB, 5, 16140, 0\n3, GPU-8b71b032-1b75-2891-935c-ce106a53034a, Tesla V100-SXM2-16GB, 5, 16140, 0\n", + "preflight_apps": "", + "preflight_ram_bytes": 64120958976, + "limits": { + "wall_seconds": 180, + "temp_bytes": 2000000000, + "ram_reserve_bytes": 6412095897, + "vram_reserve_MiB": 1614 + }, + "env": { + "PYTHONPATH": "/home/frank14f/CelerisLab/src", + "PYTHONNOUSERSITE": "1", + "PYTHONDONTWRITEBYTECODE": "1", + "OPENBLAS_NUM_THREADS": "1", + "CUDA_VISIBLE_DEVICES": "GPU-e8853ae7-a302-6a17-bcfa-aa767e9ed20c", + "CUDA_CACHE_DISABLE": "1", + "TMPDIR": "/tmp/celeris-joint24-5efo3_mj" + }, + "frozen_sha256": "68fdac18ac1b4371c2a7856456c7cc5b6f360c5dde52d282c44a68237d74028d", + "peak_group_rss_bytes": 297836544, + "peak_temp_bytes": 2081386, + "min_ram_bytes": 63740788736, + "min_vram_free_MiB": 15826, + "termination_reason": null, + "postflight_gpu": "0, GPU-e8853ae7-a302-6a17-bcfa-aa767e9ed20c, Tesla V100-SXM2-16GB, 5, 16140, 0\n1, GPU-f1c9fd5a-e917-56e0-21fb-24035ba44a36, Tesla V100-SXM2-16GB, 5, 16140, 0\n2, GPU-b8c11c01-c91f-aa0b-abf6-dad35085cc76, Tesla V100-SXM2-16GB, 5, 16140, 0\n3, GPU-8b71b032-1b75-2891-935c-ce106a53034a, Tesla V100-SXM2-16GB, 5, 16140, 0\n", + "postflight_apps": "", + "exit_code": 0, + "elapsed_seconds": 9.595732301007956, + "scratch_removed": true +} diff --git a/research/fine_surface_joint_20261014/incremental.diff b/research/fine_surface_joint_20261014/incremental.diff new file mode 100644 index 0000000..e03c132 --- /dev/null +++ b/research/fine_surface_joint_20261014/incremental.diff @@ -0,0 +1,10 @@ +--- a/src/CelerisLab/lbm/refinement_stepper.py ++++ b/src/CelerisLab/lbm/refinement_stepper.py +@@ -39,6 +39,7 @@ + velocities are in coarse lattice units (dx=dt=1). Independent local copies + are projected at fine cell centers. Their complete stencil must be active + and disjoint from the actual two-hop transfer footprint. ++ These use the edge/cell-center frame (coarse centers I+.5), whereas ordinary Simulation objects use the integer-node frame. + + ``initialize(coarse_g, fine_g)`` accepts physical Q-major (9,ny,nx) arrays + already in postcollision phase. It does not collide or build channel flags. diff --git a/research/fine_surface_joint_20261014/integrity.json b/research/fine_surface_joint_20261014/integrity.json new file mode 100644 index 0000000..a8b6e4b --- /dev/null +++ b/research/fine_surface_joint_20261014/integrity.json @@ -0,0 +1,38 @@ +{ + "baseline_files": 610, + "changed_previous_files": [ + "src/CelerisLab/lbm/refinement_stepper.py" + ], + "incremental_lines_added": 1, + "incremental_lines_deleted": 0, + "frozen_hashes_unchanged": true, + "frozen_file_count": 100, + "rows": { + "zero": { + "ledger": 24, + "collisions": 72, + "boundary": 48 + }, + "blow": { + "ledger": 24, + "collisions": 72, + "boundary": 48 + }, + "suction": { + "ledger": 24, + "collisions": 72, + "boundary": 48 + } + }, + "regions": { + "coarse_interface": 68, + "coarse_bulk": 252, + "fine_band": 124, + "transfer_slots": 196 + }, + "all_text_files_within_40000_chars": true, + "scratch_removed": true, + "temporary_before_copy_removed": true, + "review_complete": true, + "total_evidence_bytes_before_manifest": 936489 +} diff --git a/research/fine_surface_joint_20261014/manifest.json b/research/fine_surface_joint_20261014/manifest.json new file mode 100644 index 0000000..d2af502 --- /dev/null +++ b/research/fine_surface_joint_20261014/manifest.json @@ -0,0 +1,138 @@ +{ + "baseline_00.json": { + "bytes": 21302, + "sha256": "24564bba03c0d0563a04a8ef41c2c66f272c2e23d3992694e032c436b3272985" + }, + "baseline_01.json": { + "bytes": 26191, + "sha256": "1aa54afbe77b4db806ed852aa9166c6b098de8271318f33c1aec9dbca73fee00" + }, + "baseline_02.json": { + "bytes": 22440, + "sha256": "4ad20625dd7be154983bd5e834b7d9c22a9bf103fbb821198d081efab9723229" + }, + "baseline_03.json": { + "bytes": 8584, + "sha256": "c0296688fdb2e19634d4c82b389d3bfb5cc1c442e465fc35139cc5b1d6d47944" + }, + "blow_boundary.csv": { + "bytes": 12536, + "sha256": "136c42ab6daab369f813681a55546da96b9280d918178a4b7ff03d0fd5847c72" + }, + "blow_collisions.csv": { + "bytes": 19145, + "sha256": "229245407e1eb436867a6110b7b7487effeaa8dd73540d05f25288c01f5e8670" + }, + "blow_ledger.csv": { + "bytes": 15977, + "sha256": "89d9a88147b9c609d15e06c98f279daf27060cc914acd53910e74e2b46108977" + }, + "blow_propagation.csv": { + "bytes": 9714, + "sha256": "4c452e4bffaec594f8b9e17dc992a9106541d5b0d283e0a2725cdc040808b257" + }, + "blow_signals.npz": { + "bytes": 221114, + "sha256": "a78440514365bdb6c2af5424f729d856446adf14c2728da471606e24e5f8ce9a" + }, + "blow_summary.json": { + "bytes": 4113, + "sha256": "e5b574ba02848b88487bfaa64e934b4d07c598658f4012a71f014ea6d883c351" + }, + "command.txt": { + "bytes": 232, + "sha256": "99d80134c654c9eca51ba107b49bc077dfe83c7ac6f40b85378ec0b308c260a7" + }, + "criteria.txt": { + "bytes": 7480, + "sha256": "d80d6f1218b3db449ea9115fa701b9173bc866929e634e2a3b17278b65f0c256" + }, + "frozen.json": { + "bytes": 11972, + "sha256": "68fdac18ac1b4371c2a7856456c7cc5b6f360c5dde52d282c44a68237d74028d" + }, + "gpu_run.json": { + "bytes": 1955, + "sha256": "ff90cf37cf7e198cea3a26bc00a2fd905b3eb07e6dbc5028ee58c299977b8de7" + }, + "incremental.diff": { + "bytes": 625, + "sha256": "b5e3f04adf67ccc9ac79dd2e33d7871ce3247e168783df355b1224bd2c8a0941" + }, + "integrity.json": { + "bytes": 826, + "sha256": "1fb4e8332dee509528b2d18edcbf733d2d8e632c9635039def62c662b7b031e0" + }, + "regions.json": { + "bytes": 27525, + "sha256": "f31c6d6723a10df5dbb14bff7758bdf321b1cc5a395cf0b6a169ff5f44d3c54d" + }, + "report.txt": { + "bytes": 8207, + "sha256": "8a5643409f9d1796406d190fa533a2a0058acf2b3765d83606311ee385504fae" + }, + "result.json": { + "bytes": 11442, + "sha256": "846fb625d15270a906cbcfd65df4202768929ff391507856a0fe31981d611cba" + }, + "review.txt": { + "bytes": 2117, + "sha256": "d2e40a8eabe9b88e514a79eff6374a3abfe5f4db2e9a98f9a483dcbaa6464a4c" + }, + "runner.py": { + "bytes": 5847, + "sha256": "2e52a6fd8306c07415c82d9275e17d58e0597ebd9f1f45b3be81dcdb005d4737" + }, + "stdout.txt": { + "bytes": 19940, + "sha256": "81c8de698c6e141e734545df8dee063edc51829f339afb2bd15b1efa21482deb" + }, + "suction_boundary.csv": { + "bytes": 12505, + "sha256": "7a92dd8bc5e94a0262d7b06e01c03a2c2b3f808bc611e4e27820671a5bda6d32" + }, + "suction_collisions.csv": { + "bytes": 19173, + "sha256": "46d0dfaad18cb6bd988169c5a91f15bc6e7ba77e8444965361b8393fd7f86c9b" + }, + "suction_ledger.csv": { + "bytes": 16208, + "sha256": "12c8118a4ef769565e1f89476d0860dc4b4f96bc1bcad995ed083eaa53e36085" + }, + "suction_propagation.csv": { + "bytes": 9720, + "sha256": "2991ef8dbad2fa52b8382e24974782ea533ee233ad1833e1e3bdd78c3fdd4992" + }, + "suction_signals.npz": { + "bytes": 220058, + "sha256": "44f593b3c0129b575fae00ea1bc0fdb14961a4bdf9491c7db0325acc4c682f8c" + }, + "suction_summary.json": { + "bytes": 4126, + "sha256": "e2aa6da27b04a5432508c5ed440179a5075dedbd52c38478596f3248f3e8b53b" + }, + "validate.py": { + "bytes": 19576, + "sha256": "346f1223daa7ce1fb376be5e921fec5ad77c3a10992806d54ececdf199e7c3ea" + }, + "zero_boundary.csv": { + "bytes": 11491, + "sha256": "f9785fcb1bb68064675beb6240a78e23c34f5123219eb91bbe748211c5cb1f38" + }, + "zero_collisions.csv": { + "bytes": 18915, + "sha256": "2496ccaeb9a1cf3cfed81ba412d9017b7eb9e375176551abe41572b9f09931cc" + }, + "zero_ledger.csv": { + "bytes": 16051, + "sha256": "b86d46933a0193dcd7e681982406cc91f89e56d55ac57be0afa514b492e827db" + }, + "zero_signals.npz": { + "bytes": 127958, + "sha256": "71a833a056f7370dc929d9c0d321dc0f83b2fd8b2894d14403f2f16d372297a0" + }, + "zero_summary.json": { + "bytes": 1508, + "sha256": "facbe3d1568f80643ed7af3ebe93f076f9a3e0f7b1b90cb33e4b2fb27f6c25e9" + } +} diff --git a/research/fine_surface_joint_20261014/regions.json b/research/fine_surface_joint_20261014/regions.json new file mode 100644 index 0000000..7bba269 --- /dev/null +++ b/research/fine_surface_joint_20261014/regions.json @@ -0,0 +1,2766 @@ +{ + "coarse_interface": [ + [ + 3.5, + 3.5 + ], + [ + 4.5, + 3.5 + ], + [ + 5.5, + 3.5 + ], + [ + 6.5, + 3.5 + ], + [ + 7.5, + 3.5 + ], + [ + 8.5, + 3.5 + ], + [ + 9.5, + 3.5 + ], + [ + 10.5, + 3.5 + ], + [ + 11.5, + 3.5 + ], + [ + 12.5, + 3.5 + ], + [ + 13.5, + 3.5 + ], + [ + 14.5, + 3.5 + ], + [ + 15.5, + 3.5 + ], + [ + 16.5, + 3.5 + ], + [ + 17.5, + 3.5 + ], + [ + 18.5, + 3.5 + ], + [ + 19.5, + 3.5 + ], + [ + 20.5, + 3.5 + ], + [ + 3.5, + 4.5 + ], + [ + 20.5, + 4.5 + ], + [ + 3.5, + 5.5 + ], + [ + 20.5, + 5.5 + ], + [ + 3.5, + 6.5 + ], + [ + 20.5, + 6.5 + ], + [ + 3.5, + 7.5 + ], + [ + 20.5, + 7.5 + ], + [ + 3.5, + 8.5 + ], + [ + 20.5, + 8.5 + ], + [ + 3.5, + 9.5 + ], + [ + 20.5, + 9.5 + ], + [ + 3.5, + 10.5 + ], + [ + 20.5, + 10.5 + ], + [ + 3.5, + 11.5 + ], + [ + 20.5, + 11.5 + ], + [ + 3.5, + 12.5 + ], + [ + 20.5, + 12.5 + ], + [ + 3.5, + 13.5 + ], + [ + 20.5, + 13.5 + ], + [ + 3.5, + 14.5 + ], + [ + 20.5, + 14.5 + ], + [ + 3.5, + 15.5 + ], + [ + 20.5, + 15.5 + ], + [ + 3.5, + 16.5 + ], + [ + 20.5, + 16.5 + ], + [ + 3.5, + 17.5 + ], + [ + 20.5, + 17.5 + ], + [ + 3.5, + 18.5 + ], + [ + 20.5, + 18.5 + ], + [ + 3.5, + 19.5 + ], + [ + 20.5, + 19.5 + ], + [ + 3.5, + 20.5 + ], + [ + 4.5, + 20.5 + ], + [ + 5.5, + 20.5 + ], + [ + 6.5, + 20.5 + ], + [ + 7.5, + 20.5 + ], + [ + 8.5, + 20.5 + ], + [ + 9.5, + 20.5 + ], + [ + 10.5, + 20.5 + ], + [ + 11.5, + 20.5 + ], + [ + 12.5, + 20.5 + ], + [ + 13.5, + 20.5 + ], + [ + 14.5, + 20.5 + ], + [ + 15.5, + 20.5 + ], + [ + 16.5, + 20.5 + ], + [ + 17.5, + 20.5 + ], + [ + 18.5, + 20.5 + ], + [ + 19.5, + 20.5 + ], + [ + 20.5, + 20.5 + ] + ], + "coarse_bulk": [ + [ + 0.5, + 0.5 + ], + [ + 1.5, + 0.5 + ], + [ + 2.5, + 0.5 + ], + [ + 3.5, + 0.5 + ], + [ + 4.5, + 0.5 + ], + [ + 5.5, + 0.5 + ], + [ + 6.5, + 0.5 + ], + [ + 7.5, + 0.5 + ], + [ + 8.5, + 0.5 + ], + [ + 9.5, + 0.5 + ], + [ + 10.5, + 0.5 + ], + [ + 11.5, + 0.5 + ], + [ + 12.5, + 0.5 + ], + [ + 13.5, + 0.5 + ], + [ + 14.5, + 0.5 + ], + [ + 15.5, + 0.5 + ], + [ + 16.5, + 0.5 + ], + [ + 17.5, + 0.5 + ], + [ + 18.5, + 0.5 + ], + [ + 19.5, + 0.5 + ], + [ + 20.5, + 0.5 + ], + [ + 21.5, + 0.5 + ], + [ + 22.5, + 0.5 + ], + [ + 23.5, + 0.5 + ], + [ + 0.5, + 1.5 + ], + [ + 1.5, + 1.5 + ], + [ + 2.5, + 1.5 + ], + [ + 3.5, + 1.5 + ], + [ + 4.5, + 1.5 + ], + [ + 5.5, + 1.5 + ], + [ + 6.5, + 1.5 + ], + [ + 7.5, + 1.5 + ], + [ + 8.5, + 1.5 + ], + [ + 9.5, + 1.5 + ], + [ + 10.5, + 1.5 + ], + [ + 11.5, + 1.5 + ], + [ + 12.5, + 1.5 + ], + [ + 13.5, + 1.5 + ], + [ + 14.5, + 1.5 + ], + [ + 15.5, + 1.5 + ], + [ + 16.5, + 1.5 + ], + [ + 17.5, + 1.5 + ], + [ + 18.5, + 1.5 + ], + [ + 19.5, + 1.5 + ], + [ + 20.5, + 1.5 + ], + [ + 21.5, + 1.5 + ], + [ + 22.5, + 1.5 + ], + [ + 23.5, + 1.5 + ], + [ + 0.5, + 2.5 + ], + [ + 1.5, + 2.5 + ], + [ + 2.5, + 2.5 + ], + [ + 3.5, + 2.5 + ], + [ + 4.5, + 2.5 + ], + [ + 5.5, + 2.5 + ], + [ + 6.5, + 2.5 + ], + [ + 7.5, + 2.5 + ], + [ + 8.5, + 2.5 + ], + [ + 9.5, + 2.5 + ], + [ + 10.5, + 2.5 + ], + [ + 11.5, + 2.5 + ], + [ + 12.5, + 2.5 + ], + [ + 13.5, + 2.5 + ], + [ + 14.5, + 2.5 + ], + [ + 15.5, + 2.5 + ], + [ + 16.5, + 2.5 + ], + [ + 17.5, + 2.5 + ], + [ + 18.5, + 2.5 + ], + [ + 19.5, + 2.5 + ], + [ + 20.5, + 2.5 + ], + [ + 21.5, + 2.5 + ], + [ + 22.5, + 2.5 + ], + [ + 23.5, + 2.5 + ], + [ + 0.5, + 3.5 + ], + [ + 1.5, + 3.5 + ], + [ + 2.5, + 3.5 + ], + [ + 21.5, + 3.5 + ], + [ + 22.5, + 3.5 + ], + [ + 23.5, + 3.5 + ], + [ + 0.5, + 4.5 + ], + [ + 1.5, + 4.5 + ], + [ + 2.5, + 4.5 + ], + [ + 21.5, + 4.5 + ], + [ + 22.5, + 4.5 + ], + [ + 23.5, + 4.5 + ], + [ + 0.5, + 5.5 + ], + [ + 1.5, + 5.5 + ], + [ + 2.5, + 5.5 + ], + [ + 21.5, + 5.5 + ], + [ + 22.5, + 5.5 + ], + [ + 23.5, + 5.5 + ], + [ + 0.5, + 6.5 + ], + [ + 1.5, + 6.5 + ], + [ + 2.5, + 6.5 + ], + [ + 21.5, + 6.5 + ], + [ + 22.5, + 6.5 + ], + [ + 23.5, + 6.5 + ], + [ + 0.5, + 7.5 + ], + [ + 1.5, + 7.5 + ], + [ + 2.5, + 7.5 + ], + [ + 21.5, + 7.5 + ], + [ + 22.5, + 7.5 + ], + [ + 23.5, + 7.5 + ], + [ + 0.5, + 8.5 + ], + [ + 1.5, + 8.5 + ], + [ + 2.5, + 8.5 + ], + [ + 21.5, + 8.5 + ], + [ + 22.5, + 8.5 + ], + [ + 23.5, + 8.5 + ], + [ + 0.5, + 9.5 + ], + [ + 1.5, + 9.5 + ], + [ + 2.5, + 9.5 + ], + [ + 21.5, + 9.5 + ], + [ + 22.5, + 9.5 + ], + [ + 23.5, + 9.5 + ], + [ + 0.5, + 10.5 + ], + [ + 1.5, + 10.5 + ], + [ + 2.5, + 10.5 + ], + [ + 21.5, + 10.5 + ], + [ + 22.5, + 10.5 + ], + [ + 23.5, + 10.5 + ], + [ + 0.5, + 11.5 + ], + [ + 1.5, + 11.5 + ], + [ + 2.5, + 11.5 + ], + [ + 21.5, + 11.5 + ], + [ + 22.5, + 11.5 + ], + [ + 23.5, + 11.5 + ], + [ + 0.5, + 12.5 + ], + [ + 1.5, + 12.5 + ], + [ + 2.5, + 12.5 + ], + [ + 21.5, + 12.5 + ], + [ + 22.5, + 12.5 + ], + [ + 23.5, + 12.5 + ], + [ + 0.5, + 13.5 + ], + [ + 1.5, + 13.5 + ], + [ + 2.5, + 13.5 + ], + [ + 21.5, + 13.5 + ], + [ + 22.5, + 13.5 + ], + [ + 23.5, + 13.5 + ], + [ + 0.5, + 14.5 + ], + [ + 1.5, + 14.5 + ], + [ + 2.5, + 14.5 + ], + [ + 21.5, + 14.5 + ], + [ + 22.5, + 14.5 + ], + [ + 23.5, + 14.5 + ], + [ + 0.5, + 15.5 + ], + [ + 1.5, + 15.5 + ], + [ + 2.5, + 15.5 + ], + [ + 21.5, + 15.5 + ], + [ + 22.5, + 15.5 + ], + [ + 23.5, + 15.5 + ], + [ + 0.5, + 16.5 + ], + [ + 1.5, + 16.5 + ], + [ + 2.5, + 16.5 + ], + [ + 21.5, + 16.5 + ], + [ + 22.5, + 16.5 + ], + [ + 23.5, + 16.5 + ], + [ + 0.5, + 17.5 + ], + [ + 1.5, + 17.5 + ], + [ + 2.5, + 17.5 + ], + [ + 21.5, + 17.5 + ], + [ + 22.5, + 17.5 + ], + [ + 23.5, + 17.5 + ], + [ + 0.5, + 18.5 + ], + [ + 1.5, + 18.5 + ], + [ + 2.5, + 18.5 + ], + [ + 21.5, + 18.5 + ], + [ + 22.5, + 18.5 + ], + [ + 23.5, + 18.5 + ], + [ + 0.5, + 19.5 + ], + [ + 1.5, + 19.5 + ], + [ + 2.5, + 19.5 + ], + [ + 21.5, + 19.5 + ], + [ + 22.5, + 19.5 + ], + [ + 23.5, + 19.5 + ], + [ + 0.5, + 20.5 + ], + [ + 1.5, + 20.5 + ], + [ + 2.5, + 20.5 + ], + [ + 21.5, + 20.5 + ], + [ + 22.5, + 20.5 + ], + [ + 23.5, + 20.5 + ], + [ + 0.5, + 21.5 + ], + [ + 1.5, + 21.5 + ], + [ + 2.5, + 21.5 + ], + [ + 3.5, + 21.5 + ], + [ + 4.5, + 21.5 + ], + [ + 5.5, + 21.5 + ], + [ + 6.5, + 21.5 + ], + [ + 7.5, + 21.5 + ], + [ + 8.5, + 21.5 + ], + [ + 9.5, + 21.5 + ], + [ + 10.5, + 21.5 + ], + [ + 11.5, + 21.5 + ], + [ + 12.5, + 21.5 + ], + [ + 13.5, + 21.5 + ], + [ + 14.5, + 21.5 + ], + [ + 15.5, + 21.5 + ], + [ + 16.5, + 21.5 + ], + [ + 17.5, + 21.5 + ], + [ + 18.5, + 21.5 + ], + [ + 19.5, + 21.5 + ], + [ + 20.5, + 21.5 + ], + [ + 21.5, + 21.5 + ], + [ + 22.5, + 21.5 + ], + [ + 23.5, + 21.5 + ], + [ + 0.5, + 22.5 + ], + [ + 1.5, + 22.5 + ], + [ + 2.5, + 22.5 + ], + [ + 3.5, + 22.5 + ], + [ + 4.5, + 22.5 + ], + [ + 5.5, + 22.5 + ], + [ + 6.5, + 22.5 + ], + [ + 7.5, + 22.5 + ], + [ + 8.5, + 22.5 + ], + [ + 9.5, + 22.5 + ], + [ + 10.5, + 22.5 + ], + [ + 11.5, + 22.5 + ], + [ + 12.5, + 22.5 + ], + [ + 13.5, + 22.5 + ], + [ + 14.5, + 22.5 + ], + [ + 15.5, + 22.5 + ], + [ + 16.5, + 22.5 + ], + [ + 17.5, + 22.5 + ], + [ + 18.5, + 22.5 + ], + [ + 19.5, + 22.5 + ], + [ + 20.5, + 22.5 + ], + [ + 21.5, + 22.5 + ], + [ + 22.5, + 22.5 + ], + [ + 23.5, + 22.5 + ], + [ + 0.5, + 23.5 + ], + [ + 1.5, + 23.5 + ], + [ + 2.5, + 23.5 + ], + [ + 3.5, + 23.5 + ], + [ + 4.5, + 23.5 + ], + [ + 5.5, + 23.5 + ], + [ + 6.5, + 23.5 + ], + [ + 7.5, + 23.5 + ], + [ + 8.5, + 23.5 + ], + [ + 9.5, + 23.5 + ], + [ + 10.5, + 23.5 + ], + [ + 11.5, + 23.5 + ], + [ + 12.5, + 23.5 + ], + [ + 13.5, + 23.5 + ], + [ + 14.5, + 23.5 + ], + [ + 15.5, + 23.5 + ], + [ + 16.5, + 23.5 + ], + [ + 17.5, + 23.5 + ], + [ + 18.5, + 23.5 + ], + [ + 19.5, + 23.5 + ], + [ + 20.5, + 23.5 + ], + [ + 21.5, + 23.5 + ], + [ + 22.5, + 23.5 + ], + [ + 23.5, + 23.5 + ] + ], + "fine_band": [ + [ + 4.25, + 4.25 + ], + [ + 4.75, + 4.25 + ], + [ + 5.25, + 4.25 + ], + [ + 5.75, + 4.25 + ], + [ + 6.25, + 4.25 + ], + [ + 6.75, + 4.25 + ], + [ + 7.25, + 4.25 + ], + [ + 7.75, + 4.25 + ], + [ + 8.25, + 4.25 + ], + [ + 8.75, + 4.25 + ], + [ + 9.25, + 4.25 + ], + [ + 9.75, + 4.25 + ], + [ + 10.25, + 4.25 + ], + [ + 10.75, + 4.25 + ], + [ + 11.25, + 4.25 + ], + [ + 11.75, + 4.25 + ], + [ + 12.25, + 4.25 + ], + [ + 12.75, + 4.25 + ], + [ + 13.25, + 4.25 + ], + [ + 13.75, + 4.25 + ], + [ + 14.25, + 4.25 + ], + [ + 14.75, + 4.25 + ], + [ + 15.25, + 4.25 + ], + [ + 15.75, + 4.25 + ], + [ + 16.25, + 4.25 + ], + [ + 16.75, + 4.25 + ], + [ + 17.25, + 4.25 + ], + [ + 17.75, + 4.25 + ], + [ + 18.25, + 4.25 + ], + [ + 18.75, + 4.25 + ], + [ + 19.25, + 4.25 + ], + [ + 19.75, + 4.25 + ], + [ + 4.25, + 4.75 + ], + [ + 19.75, + 4.75 + ], + [ + 4.25, + 5.25 + ], + [ + 19.75, + 5.25 + ], + [ + 4.25, + 5.75 + ], + [ + 19.75, + 5.75 + ], + [ + 4.25, + 6.25 + ], + [ + 19.75, + 6.25 + ], + [ + 4.25, + 6.75 + ], + [ + 19.75, + 6.75 + ], + [ + 4.25, + 7.25 + ], + [ + 19.75, + 7.25 + ], + [ + 4.25, + 7.75 + ], + [ + 19.75, + 7.75 + ], + [ + 4.25, + 8.25 + ], + [ + 19.75, + 8.25 + ], + [ + 4.25, + 8.75 + ], + [ + 19.75, + 8.75 + ], + [ + 4.25, + 9.25 + ], + [ + 19.75, + 9.25 + ], + [ + 4.25, + 9.75 + ], + [ + 19.75, + 9.75 + ], + [ + 4.25, + 10.25 + ], + [ + 19.75, + 10.25 + ], + [ + 4.25, + 10.75 + ], + [ + 19.75, + 10.75 + ], + [ + 4.25, + 11.25 + ], + [ + 19.75, + 11.25 + ], + [ + 4.25, + 11.75 + ], + [ + 19.75, + 11.75 + ], + [ + 4.25, + 12.25 + ], + [ + 19.75, + 12.25 + ], + [ + 4.25, + 12.75 + ], + [ + 19.75, + 12.75 + ], + [ + 4.25, + 13.25 + ], + [ + 19.75, + 13.25 + ], + [ + 4.25, + 13.75 + ], + [ + 19.75, + 13.75 + ], + [ + 4.25, + 14.25 + ], + [ + 19.75, + 14.25 + ], + [ + 4.25, + 14.75 + ], + [ + 19.75, + 14.75 + ], + [ + 4.25, + 15.25 + ], + [ + 19.75, + 15.25 + ], + [ + 4.25, + 15.75 + ], + [ + 19.75, + 15.75 + ], + [ + 4.25, + 16.25 + ], + [ + 19.75, + 16.25 + ], + [ + 4.25, + 16.75 + ], + [ + 19.75, + 16.75 + ], + [ + 4.25, + 17.25 + ], + [ + 19.75, + 17.25 + ], + [ + 4.25, + 17.75 + ], + [ + 19.75, + 17.75 + ], + [ + 4.25, + 18.25 + ], + [ + 19.75, + 18.25 + ], + [ + 4.25, + 18.75 + ], + [ + 19.75, + 18.75 + ], + [ + 4.25, + 19.25 + ], + [ + 19.75, + 19.25 + ], + [ + 4.25, + 19.75 + ], + [ + 4.75, + 19.75 + ], + [ + 5.25, + 19.75 + ], + [ + 5.75, + 19.75 + ], + [ + 6.25, + 19.75 + ], + [ + 6.75, + 19.75 + ], + [ + 7.25, + 19.75 + ], + [ + 7.75, + 19.75 + ], + [ + 8.25, + 19.75 + ], + [ + 8.75, + 19.75 + ], + [ + 9.25, + 19.75 + ], + [ + 9.75, + 19.75 + ], + [ + 10.25, + 19.75 + ], + [ + 10.75, + 19.75 + ], + [ + 11.25, + 19.75 + ], + [ + 11.75, + 19.75 + ], + [ + 12.25, + 19.75 + ], + [ + 12.75, + 19.75 + ], + [ + 13.25, + 19.75 + ], + [ + 13.75, + 19.75 + ], + [ + 14.25, + 19.75 + ], + [ + 14.75, + 19.75 + ], + [ + 15.25, + 19.75 + ], + [ + 15.75, + 19.75 + ], + [ + 16.25, + 19.75 + ], + [ + 16.75, + 19.75 + ], + [ + 17.25, + 19.75 + ], + [ + 17.75, + 19.75 + ], + [ + 18.25, + 19.75 + ], + [ + 18.75, + 19.75 + ], + [ + 19.25, + 19.75 + ], + [ + 19.75, + 19.75 + ] + ], + "transfer_slots": [ + { + "q": 6, + "x": 3.5, + "y": 3.5 + }, + { + "q": 4, + "x": 4.5, + "y": 3.5 + }, + { + "q": 6, + "x": 4.5, + "y": 3.5 + }, + { + "q": 7, + "x": 4.5, + "y": 3.5 + }, + { + "q": 4, + "x": 5.5, + "y": 3.5 + }, + { + "q": 6, + "x": 5.5, + "y": 3.5 + }, + { + "q": 7, + "x": 5.5, + "y": 3.5 + }, + { + "q": 4, + "x": 6.5, + "y": 3.5 + }, + { + "q": 6, + "x": 6.5, + "y": 3.5 + }, + { + "q": 7, + "x": 6.5, + "y": 3.5 + }, + { + "q": 4, + "x": 7.5, + "y": 3.5 + }, + { + "q": 6, + "x": 7.5, + "y": 3.5 + }, + { + "q": 7, + "x": 7.5, + "y": 3.5 + }, + { + "q": 4, + "x": 8.5, + "y": 3.5 + }, + { + "q": 6, + "x": 8.5, + "y": 3.5 + }, + { + "q": 7, + "x": 8.5, + "y": 3.5 + }, + { + "q": 4, + "x": 9.5, + "y": 3.5 + }, + { + "q": 6, + "x": 9.5, + "y": 3.5 + }, + { + "q": 7, + "x": 9.5, + "y": 3.5 + }, + { + "q": 4, + "x": 10.5, + "y": 3.5 + }, + { + "q": 6, + "x": 10.5, + "y": 3.5 + }, + { + "q": 7, + "x": 10.5, + "y": 3.5 + }, + { + "q": 4, + "x": 11.5, + "y": 3.5 + }, + { + "q": 6, + "x": 11.5, + "y": 3.5 + }, + { + "q": 7, + "x": 11.5, + "y": 3.5 + }, + { + "q": 4, + "x": 12.5, + "y": 3.5 + }, + { + "q": 6, + "x": 12.5, + "y": 3.5 + }, + { + "q": 7, + "x": 12.5, + "y": 3.5 + }, + { + "q": 4, + "x": 13.5, + "y": 3.5 + }, + { + "q": 6, + "x": 13.5, + "y": 3.5 + }, + { + "q": 7, + "x": 13.5, + "y": 3.5 + }, + { + "q": 4, + "x": 14.5, + "y": 3.5 + }, + { + "q": 6, + "x": 14.5, + "y": 3.5 + }, + { + "q": 7, + "x": 14.5, + "y": 3.5 + }, + { + "q": 4, + "x": 15.5, + "y": 3.5 + }, + { + "q": 6, + "x": 15.5, + "y": 3.5 + }, + { + "q": 7, + "x": 15.5, + "y": 3.5 + }, + { + "q": 4, + "x": 16.5, + "y": 3.5 + }, + { + "q": 6, + "x": 16.5, + "y": 3.5 + }, + { + "q": 7, + "x": 16.5, + "y": 3.5 + }, + { + "q": 4, + "x": 17.5, + "y": 3.5 + }, + { + "q": 6, + "x": 17.5, + "y": 3.5 + }, + { + "q": 7, + "x": 17.5, + "y": 3.5 + }, + { + "q": 4, + "x": 18.5, + "y": 3.5 + }, + { + "q": 6, + "x": 18.5, + "y": 3.5 + }, + { + "q": 7, + "x": 18.5, + "y": 3.5 + }, + { + "q": 4, + "x": 19.5, + "y": 3.5 + }, + { + "q": 6, + "x": 19.5, + "y": 3.5 + }, + { + "q": 7, + "x": 19.5, + "y": 3.5 + }, + { + "q": 7, + "x": 20.5, + "y": 3.5 + }, + { + "q": 2, + "x": 3.5, + "y": 4.5 + }, + { + "q": 6, + "x": 3.5, + "y": 4.5 + }, + { + "q": 8, + "x": 3.5, + "y": 4.5 + }, + { + "q": 1, + "x": 20.5, + "y": 4.5 + }, + { + "q": 5, + "x": 20.5, + "y": 4.5 + }, + { + "q": 7, + "x": 20.5, + "y": 4.5 + }, + { + "q": 2, + "x": 3.5, + "y": 5.5 + }, + { + "q": 6, + "x": 3.5, + "y": 5.5 + }, + { + "q": 8, + "x": 3.5, + "y": 5.5 + }, + { + "q": 1, + "x": 20.5, + "y": 5.5 + }, + { + "q": 5, + "x": 20.5, + "y": 5.5 + }, + { + "q": 7, + "x": 20.5, + "y": 5.5 + }, + { + "q": 2, + "x": 3.5, + "y": 6.5 + }, + { + "q": 6, + "x": 3.5, + "y": 6.5 + }, + { + "q": 8, + "x": 3.5, + "y": 6.5 + }, + { + "q": 1, + "x": 20.5, + "y": 6.5 + }, + { + "q": 5, + "x": 20.5, + "y": 6.5 + }, + { + "q": 7, + "x": 20.5, + "y": 6.5 + }, + { + "q": 2, + "x": 3.5, + "y": 7.5 + }, + { + "q": 6, + "x": 3.5, + "y": 7.5 + }, + { + "q": 8, + "x": 3.5, + "y": 7.5 + }, + { + "q": 1, + "x": 20.5, + "y": 7.5 + }, + { + "q": 5, + "x": 20.5, + "y": 7.5 + }, + { + "q": 7, + "x": 20.5, + "y": 7.5 + }, + { + "q": 2, + "x": 3.5, + "y": 8.5 + }, + { + "q": 6, + "x": 3.5, + "y": 8.5 + }, + { + "q": 8, + "x": 3.5, + "y": 8.5 + }, + { + "q": 1, + "x": 20.5, + "y": 8.5 + }, + { + "q": 5, + "x": 20.5, + "y": 8.5 + }, + { + "q": 7, + "x": 20.5, + "y": 8.5 + }, + { + "q": 2, + "x": 3.5, + "y": 9.5 + }, + { + "q": 6, + "x": 3.5, + "y": 9.5 + }, + { + "q": 8, + "x": 3.5, + "y": 9.5 + }, + { + "q": 1, + "x": 20.5, + "y": 9.5 + }, + { + "q": 5, + "x": 20.5, + "y": 9.5 + }, + { + "q": 7, + "x": 20.5, + "y": 9.5 + }, + { + "q": 2, + "x": 3.5, + "y": 10.5 + }, + { + "q": 6, + "x": 3.5, + "y": 10.5 + }, + { + "q": 8, + "x": 3.5, + "y": 10.5 + }, + { + "q": 1, + "x": 20.5, + "y": 10.5 + }, + { + "q": 5, + "x": 20.5, + "y": 10.5 + }, + { + "q": 7, + "x": 20.5, + "y": 10.5 + }, + { + "q": 2, + "x": 3.5, + "y": 11.5 + }, + { + "q": 6, + "x": 3.5, + "y": 11.5 + }, + { + "q": 8, + "x": 3.5, + "y": 11.5 + }, + { + "q": 1, + "x": 20.5, + "y": 11.5 + }, + { + "q": 5, + "x": 20.5, + "y": 11.5 + }, + { + "q": 7, + "x": 20.5, + "y": 11.5 + }, + { + "q": 2, + "x": 3.5, + "y": 12.5 + }, + { + "q": 6, + "x": 3.5, + "y": 12.5 + }, + { + "q": 8, + "x": 3.5, + "y": 12.5 + }, + { + "q": 1, + "x": 20.5, + "y": 12.5 + }, + { + "q": 5, + "x": 20.5, + "y": 12.5 + }, + { + "q": 7, + "x": 20.5, + "y": 12.5 + }, + { + "q": 2, + "x": 3.5, + "y": 13.5 + }, + { + "q": 6, + "x": 3.5, + "y": 13.5 + }, + { + "q": 8, + "x": 3.5, + "y": 13.5 + }, + { + "q": 1, + "x": 20.5, + "y": 13.5 + }, + { + "q": 5, + "x": 20.5, + "y": 13.5 + }, + { + "q": 7, + "x": 20.5, + "y": 13.5 + }, + { + "q": 2, + "x": 3.5, + "y": 14.5 + }, + { + "q": 6, + "x": 3.5, + "y": 14.5 + }, + { + "q": 8, + "x": 3.5, + "y": 14.5 + }, + { + "q": 1, + "x": 20.5, + "y": 14.5 + }, + { + "q": 5, + "x": 20.5, + "y": 14.5 + }, + { + "q": 7, + "x": 20.5, + "y": 14.5 + }, + { + "q": 2, + "x": 3.5, + "y": 15.5 + }, + { + "q": 6, + "x": 3.5, + "y": 15.5 + }, + { + "q": 8, + "x": 3.5, + "y": 15.5 + }, + { + "q": 1, + "x": 20.5, + "y": 15.5 + }, + { + "q": 5, + "x": 20.5, + "y": 15.5 + }, + { + "q": 7, + "x": 20.5, + "y": 15.5 + }, + { + "q": 2, + "x": 3.5, + "y": 16.5 + }, + { + "q": 6, + "x": 3.5, + "y": 16.5 + }, + { + "q": 8, + "x": 3.5, + "y": 16.5 + }, + { + "q": 1, + "x": 20.5, + "y": 16.5 + }, + { + "q": 5, + "x": 20.5, + "y": 16.5 + }, + { + "q": 7, + "x": 20.5, + "y": 16.5 + }, + { + "q": 2, + "x": 3.5, + "y": 17.5 + }, + { + "q": 6, + "x": 3.5, + "y": 17.5 + }, + { + "q": 8, + "x": 3.5, + "y": 17.5 + }, + { + "q": 1, + "x": 20.5, + "y": 17.5 + }, + { + "q": 5, + "x": 20.5, + "y": 17.5 + }, + { + "q": 7, + "x": 20.5, + "y": 17.5 + }, + { + "q": 2, + "x": 3.5, + "y": 18.5 + }, + { + "q": 6, + "x": 3.5, + "y": 18.5 + }, + { + "q": 8, + "x": 3.5, + "y": 18.5 + }, + { + "q": 1, + "x": 20.5, + "y": 18.5 + }, + { + "q": 5, + "x": 20.5, + "y": 18.5 + }, + { + "q": 7, + "x": 20.5, + "y": 18.5 + }, + { + "q": 2, + "x": 3.5, + "y": 19.5 + }, + { + "q": 6, + "x": 3.5, + "y": 19.5 + }, + { + "q": 8, + "x": 3.5, + "y": 19.5 + }, + { + "q": 1, + "x": 20.5, + "y": 19.5 + }, + { + "q": 5, + "x": 20.5, + "y": 19.5 + }, + { + "q": 7, + "x": 20.5, + "y": 19.5 + }, + { + "q": 8, + "x": 3.5, + "y": 20.5 + }, + { + "q": 3, + "x": 4.5, + "y": 20.5 + }, + { + "q": 5, + "x": 4.5, + "y": 20.5 + }, + { + "q": 8, + "x": 4.5, + "y": 20.5 + }, + { + "q": 3, + "x": 5.5, + "y": 20.5 + }, + { + "q": 5, + "x": 5.5, + "y": 20.5 + }, + { + "q": 8, + "x": 5.5, + "y": 20.5 + }, + { + "q": 3, + "x": 6.5, + "y": 20.5 + }, + { + "q": 5, + "x": 6.5, + "y": 20.5 + }, + { + "q": 8, + "x": 6.5, + "y": 20.5 + }, + { + "q": 3, + "x": 7.5, + "y": 20.5 + }, + { + "q": 5, + "x": 7.5, + "y": 20.5 + }, + { + "q": 8, + "x": 7.5, + "y": 20.5 + }, + { + "q": 3, + "x": 8.5, + "y": 20.5 + }, + { + "q": 5, + "x": 8.5, + "y": 20.5 + }, + { + "q": 8, + "x": 8.5, + "y": 20.5 + }, + { + "q": 3, + "x": 9.5, + "y": 20.5 + }, + { + "q": 5, + "x": 9.5, + "y": 20.5 + }, + { + "q": 8, + "x": 9.5, + "y": 20.5 + }, + { + "q": 3, + "x": 10.5, + "y": 20.5 + }, + { + "q": 5, + "x": 10.5, + "y": 20.5 + }, + { + "q": 8, + "x": 10.5, + "y": 20.5 + }, + { + "q": 3, + "x": 11.5, + "y": 20.5 + }, + { + "q": 5, + "x": 11.5, + "y": 20.5 + }, + { + "q": 8, + "x": 11.5, + "y": 20.5 + }, + { + "q": 3, + "x": 12.5, + "y": 20.5 + }, + { + "q": 5, + "x": 12.5, + "y": 20.5 + }, + { + "q": 8, + "x": 12.5, + "y": 20.5 + }, + { + "q": 3, + "x": 13.5, + "y": 20.5 + }, + { + "q": 5, + "x": 13.5, + "y": 20.5 + }, + { + "q": 8, + "x": 13.5, + "y": 20.5 + }, + { + "q": 3, + "x": 14.5, + "y": 20.5 + }, + { + "q": 5, + "x": 14.5, + "y": 20.5 + }, + { + "q": 8, + "x": 14.5, + "y": 20.5 + }, + { + "q": 3, + "x": 15.5, + "y": 20.5 + }, + { + "q": 5, + "x": 15.5, + "y": 20.5 + }, + { + "q": 8, + "x": 15.5, + "y": 20.5 + }, + { + "q": 3, + "x": 16.5, + "y": 20.5 + }, + { + "q": 5, + "x": 16.5, + "y": 20.5 + }, + { + "q": 8, + "x": 16.5, + "y": 20.5 + }, + { + "q": 3, + "x": 17.5, + "y": 20.5 + }, + { + "q": 5, + "x": 17.5, + "y": 20.5 + }, + { + "q": 8, + "x": 17.5, + "y": 20.5 + }, + { + "q": 3, + "x": 18.5, + "y": 20.5 + }, + { + "q": 5, + "x": 18.5, + "y": 20.5 + }, + { + "q": 8, + "x": 18.5, + "y": 20.5 + }, + { + "q": 3, + "x": 19.5, + "y": 20.5 + }, + { + "q": 5, + "x": 19.5, + "y": 20.5 + }, + { + "q": 8, + "x": 19.5, + "y": 20.5 + }, + { + "q": 5, + "x": 20.5, + "y": 20.5 + } + ] +} diff --git a/research/fine_surface_joint_20261014/report.txt b/research/fine_surface_joint_20261014/report.txt new file mode 100644 index 0000000..d7571e0 --- /dev/null +++ b/research/fine_surface_joint_20261014/report.txt @@ -0,0 +1,110 @@ +2026-10-14 — fine surface + fixed patch:24粗步短联合验证 + +结果:仅运行0、+.002、-.002三条同时间轨迹,各24coarse/48fine、物理时间24; +唯一GPU批次exit0,全部预设局部算子、有效性、记账与传播检查通过,已停止。 +这不是严格守恒、物理精度、成熟喷流、空间收敛或长期稳定性认证。 + +先报告未修正累计收支残差(质量、Px、Py;实际FP32 transfer账本): + 零驱动 +2.2911839187e-4 +5.9055164456e-6 +3.9162114263e-6 + 正吹 +2.8965249658e-4 +8.0140307546e-6 +4.8289075494e-6 + 负吸 +3.3393828198e-4 +2.1932646632e-7 +2.6496127248e-7 +相对零驱动的原始残差差值(不是修正后的守恒量): + 正吹 +6.0534104705e-5 +2.1085143089e-6 +9.1269612312e-7 + 负吸 +1.0481989011e-4 -5.6861899793e-6 -3.6512501538e-6 +零驱动本身有FP32累计漂移,不能把bitwise非零视为传播,也不能把舍入后闭合0 +说成原始残差为0。正吹/负吸的原始质量残差分别约占实际边界净质量交换的 +0.310%/0.357%;扣同时间零驱动基线后的差值分别约占0.0647%/0.1122%。 +这里只报告比例,没有事后以这些比例新增通过判据。 + +传播证据(两驱动同样的首次达标时间和物理坐标;时间以整数粗步采样): +量 首次t/位置 正吹差值 负吸差值 +fine接口内侧post-G neq 6 /(19.75,13.25) 3.86611e-7 3.73349e-7 +真实transfer arrival neq 7 /(20.5,13.5),q1 9.91749e-7 1.00666e-6 +coarse接收圈post-G速度 7 /(20.5,13.5) 4.06647e-6 4.09198e-6 +接收圈之外coarse bulk速度 8 /(13.5,21.5) 1.10692e-6 1.01799e-6 +对应零驱动基线依次9.93410e-9、1.49012e-8、2.01166e-7、1.00583e-7。 +预先固定速度差>1e-6,neq差>1e-7,且均>同位置/时间/阶段基线10倍;两符号均满足。 +负吸bulk首次点的绝对速度9.17512e-7,差值1.01799e-6;判据本来就针对差值, +未把它改写为绝对速度超过1e-6。随后峰值处绝对速度和差值均明显非零。 + +峰值(相对零驱动,全部位于预设采样窗口内): +量 峰值t/位置 正吹 负吸 +fine接口内侧neq 10 /(19.75,15.25) 7.49818e-6 7.38603e-6 +真实transfer neq 11 /(20.5,14.5),q1 2.63668e-5 2.62411e-5 +coarse接收圈速度 14 /(20.5,15.5) 2.88503e-4 2.87819e-4 +接收圈之外bulk速度 16 /(21.5,15.5) 2.56991e-4 2.56441e-4 +这里证明喷吸启动扰动实际到达并通过接口,可能含压力/声学传播。不同指标的 +首次点是各自固定区域的检测见证,不冒称同一个流体质点的轨迹。24粗步内不能 +判断成熟射流或纯剪切扰动的跨接口精度。区域及实际传递方向保存在regions.json; +每步指标、first/peak、同点基线和绝对值均有CSV/JSON;小型NPZ供离线复核。 + +逐步收支与舍入: +每条轨迹24行复合叶节点质量/动量账本;48行真实fine边界交换(每区间2行、 +每次面积权重1/4);72行局部collision诊断(每区间fine2次、coarse1次)。 +实际fluid boundary、fine transfer和coarse transfer分别统计,未用最新一帧 +link_exchange代替两子步累计。最新body impulse另列,仅为该子步的动量交换; +fine rate=该子步交换/.5,coarse rate=两子步之和/1,不冒充总推力。 + +24区间累计(质量、Px、Py): +正吹B = (+.0935678868555, +.0148278460838, +.0125229167752) +正吹F = (-.0672332551330, -.0119119063020, -.0101141575724) +正吹C = (+.0672331918031, +.0119117666036, +.0101140532643) +负吸B = (-.0934597565793, -.0147664458491, -.0124674369581) +负吸F = (+.0670307464898, +.0118954917416, +.0100988540798) +负吸C = (-.0670307874680, -.0118956044316, -.0100990422070) +其中B为solid边界净交换,F为fine叶/halo交换,C为coarse真实incoming收支。 +正吹/负吸同实际population上相对passive BFL oracle的累计附加质量分别 ++.0743640140662、-.0742686590511,符号正确;这不是额外轨迹或守恒修正。 + +每个碰撞逐q/节点独立FP64 SRT参考:使用实际读回FP32omega并核对tau/force; +固定近静止判据|GPUout-SRT64(actual_input)|<=8*eps32*|input_q|。 +三轨迹最大归一化误差分别.463942、.569605、.528511,全部<1; +最大绝对误差分别1.29143e-7、1.58655e-7、1.64771e-7。 +它是本例的固定局部容差,考虑实际fast-math/FMA路径,不是一般舍入定理。 +每次局部M(output-input)独立测得的累计漂移与原始账本残差吻合;逐区间和累计 +剩余闭合误差在FP64计账中恰为0,满足预设1e-10/1e-9。这个零是记账分解验证, +不是离散方案的精确物理守恒结论,也未以全域大容差掩盖raw残差。 + +coalescence的顺序FP32四子格平均与精确FP64均值之差独立由实际children计算, +所有槽通过固定gamma3局部界限;实际transfer账本已经包含它,没有重复扣除。 +累计平均舍入(质量、Px、Py): + 零驱动 (-5.7183206081e-7, -1.8812716007e-7, -2.8312206268e-7) + 正吹 (-6.3329935074e-8, -1.3969838619e-7, -1.0430812836e-7) + 负吸 (-4.0978193283e-8, -1.1269003153e-7, -1.8812716007e-7) +采用精确平均记账的原始残差亦保存在各summary的exact_average_residual中。 +BFL最大局部误差三轨迹均<=1.27259e-8,低于冻结1e-7。 +未从末态差反推任何收支项,也未看到结果后改公式、阈值、窗口或步数。 + +有效性:每细步active流体有限、solid与最外2层halo为NaN;inner ghost按真实 +逐方向stream-only(包含合法NaN)核对。每粗步发布fine全部非叶和coarse covered +均NaN;leaf finite、局部密度/速度范围达标;几何/flags/源对象不变。 +coarse320叶节点,其中68接口接收节点、252外部bulk;fine963流体叶, +124接口内侧节点;实际coalescence196方向槽,包括原有8个grazing-corner槽。 + +执行和范围: +冻结2026-10-14 05:55:03 UTC,GPU启动05:55:16 UTC,实际耗时9.596s,exit0。 +GPU0 UUID GPU-e8853ae7-a302-6a17-bcfa-aa767e9ed20c,预检5MiB/util0/无计算进程。 +包来源严格为/home/frank14f/CelerisLab/src;现有pycuda_3_10环境;未安装依赖。 +峰值进程组RSS297836544bytes,最少可用RAM63740788736bytes,最少可用VRAM +15826MiB,本轮临时与证据采样峰值2081386bytes,远小于2GB;无保护触发。 +采样保护不是OS硬隔离;独占scratch已删除,GPU退出后5MiB且无计算进程。 + +生产增量只有refinement_stepper.py一行文档,+1/-0,明确fine_objects采用 +edge/cell-center坐标(coarse中心I+.5),普通Simulation使用integer-node坐标。 +完整610文件基线比对仅这一文件改变;既有dirty、旧审查和运行证据全部保留; +100个冻结脚本/源码哈希复核一致;不改生产公式、helper、网格或推进时序; +无提交/推送、无DynamisLab修改、无额外GPU矩阵。默认旧测试未改未重跑。 + +证据导航: +criteria.txt + frozen.json:运行前完整判据、时间戳、SHA256;不可事后改写。 +command.txt + runner.py + gpu_run.json + stdout.txt:确切命令、环境、预检、退出。 +validate.py:本次独立验证脚本,复用已接受test_fine_surface_gpu.py的只读钩子。 +zero/blow/suction_{ledger,collisions,boundary}.csv:必要逐步量与分解。 +blow/suction_propagation.csv、*_summary.json、*_signals.npz:信号与对齐基线。 +result.json:固定判据结果;regions.json:坐标/方向;integrity.json:范围完整性。 +incremental.diff:唯一生产增量;baseline_*.json:保留旧文件的哈希基线。 +代码/数值只读agent交叉复核见review.txt。所有最终文本每份<=40000字符。 + +限制:以上仅短时离散联合一致性和启动扰动跨接口证据。原始FP32漂移仍存在, +未在本轮修正;不证明物理精度、空间收敛、稳态、长时稳定、性能或通用AMR。 +此步已完成并停止,没有延伸B墙穿接口候选、checkpoint或其他特性。 diff --git a/research/fine_surface_joint_20261014/result.json b/research/fine_surface_joint_20261014/result.json new file mode 100644 index 0000000..9580c26 --- /dev/null +++ b/research/fine_surface_joint_20261014/result.json @@ -0,0 +1,412 @@ +{ + "passed": true, + "runs": { + "zero": { + "speed": 0.0, + "initial_leaf": [ + 560.7500041779131, + 0.0, + 0.0 + ], + "final_leaf": [ + 560.7502328557894, + 4.124827682971954e-06, + 3.1795352697372437e-06 + ], + "raw_residual": [ + 0.00022911839187145233, + 5.905516445636749e-06, + 3.916211426258087e-06 + ], + "exact_average_residual": [ + 0.00022854655981063843, + 5.717389285564423e-06, + 3.6330893635749817e-06 + ], + "cumulative": { + "boundary": [ + 1.3131648302078247e-07, + -1.5925616025924683e-06, + -4.5355409383773804e-07 + ], + "fine_transfer": [ + -9.47713851928711e-05, + 3.1068921089172363e-06, + -2.084299921989441e-06 + ], + "coarse_transfer": [ + 9.419955313205719e-05, + -3.295019268989563e-06, + 1.8011778593063354e-06 + ], + "rounding": [ + 0.00022911839187145233, + 5.905516445636749e-06, + 3.916211426258087e-06 + ], + "average": [ + -5.718320608139038e-07, + -1.8812716007232666e-07, + -2.8312206268310547e-07 + ] + }, + "checks": { + "validity": true, + "geometry_unchanged": true, + "boundary_count": 48, + "collision_count": 72, + "local_collision": true, + "local_regime": true, + "bfl": true, + "transfer_rounding": true, + "interval_closure": true, + "cumulative_closure": true + }, + "max_collision_ratio": 0.46394191845799526, + "max_collision_error": 1.2914339875269576e-07, + "max_bfl_error": 1.0332863675799331e-08, + "max_interval_closure": 0.0, + "drive_mass": 3.733417470608985e-07 + }, + "blow": { + "speed": 0.002, + "initial_leaf": [ + 560.7500041779131, + 0.0, + 0.0 + ], + "final_leaf": [ + 560.8438616539352, + 0.014835720416158438, + 0.012527641374617815 + ], + "raw_residual": [ + 0.0002896524965763092, + 8.014030754566193e-06, + 4.828907549381256e-06 + ], + "exact_average_residual": [ + 0.00028958916664123535, + 7.874332368373871e-06, + 4.7245994210243225e-06 + ], + "cumulative": { + "boundary": [ + 0.09356788685545325, + 0.014827846083790064, + 0.01252291677519679 + ], + "fine_transfer": [ + -0.0672332551330328, + -0.01191190630197525, + -0.010114157572388649 + ], + "coarse_transfer": [ + 0.06723319180309772, + 0.011911766603589058, + 0.010114053264260292 + ], + "rounding": [ + 0.0002896524965763092, + 8.014030754566193e-06, + 4.828907549381256e-06 + ], + "average": [ + -6.332993507385254e-08, + -1.3969838619232178e-07, + -1.043081283569336e-07 + ] + }, + "checks": { + "validity": true, + "geometry_unchanged": true, + "boundary_count": 48, + "collision_count": 72, + "local_collision": true, + "local_regime": true, + "bfl": true, + "transfer_rounding": true, + "interval_closure": true, + "cumulative_closure": true, + "propagation": true, + "drive_sign": true + }, + "max_collision_ratio": 0.5696050037738337, + "max_collision_error": 1.5865499780609582e-07, + "max_bfl_error": 1.2725840020655355e-08, + "max_interval_closure": 0.0, + "drive_mass": 0.07436401406617413, + "propagation": { + "coarse_interface_u": { + "threshold": 1e-06, + "baseline_factor": 10, + "first_arrival": { + "time": 7, + "signal": 4.0664670353703905e-06, + "baseline": 2.0116559817931723e-07, + "absolute": 4.267265792606936e-06, + "x": 20.5, + "y": 13.5 + }, + "peak": { + "metric": "coarse_interface_u", + "time": 14, + "signal": 0.00028850325159438407, + "baseline": 3.003423681142711e-08, + "absolute": 0.00028847339892346693, + "any_crossed": true, + "peak_crossed": true, + "x": 20.5, + "y": 15.5 + } + }, + "coarse_bulk_u": { + "threshold": 1e-06, + "baseline_factor": 10, + "first_arrival": { + "time": 8, + "signal": 1.1069172403255332e-06, + "baseline": 1.005827957173589e-07, + "absolute": 1.2074577299858699e-06, + "x": 13.5, + "y": 21.5 + }, + "peak": { + "metric": "coarse_bulk_u", + "time": 16, + "signal": 0.00025699080829703886, + "baseline": 0.0, + "absolute": 0.00025699080829703886, + "any_crossed": true, + "peak_crossed": true, + "x": 21.5, + "y": 15.5 + } + }, + "fine_band_neq": { + "threshold": 1e-07, + "baseline_factor": 10, + "first_arrival": { + "time": 6, + "signal": 3.8661114470928126e-07, + "baseline": 9.934099098884985e-09, + "absolute": 3.766770456103963e-07, + "x": 19.75, + "y": 13.25 + }, + "peak": { + "metric": "fine_band_neq", + "time": 10, + "signal": 7.498180437826019e-06, + "baseline": 9.106256526614231e-09, + "absolute": 7.489074181299404e-06, + "any_crossed": true, + "peak_crossed": true, + "x": 19.75, + "y": 15.25 + } + }, + "transfer_neq": { + "threshold": 1e-07, + "baseline_factor": 10, + "first_arrival": { + "time": 7, + "signal": 9.917490157301811e-07, + "baseline": 1.4901174696935193e-08, + "absolute": 9.76847841033246e-07, + "q": 1, + "x": 20.5, + "y": 13.5 + }, + "peak": { + "metric": "transfer_neq", + "time": 11, + "signal": 2.6366830318105827e-05, + "baseline": 8.692339972804497e-09, + "absolute": 2.6375522658078632e-05, + "any_crossed": true, + "peak_crossed": true, + "q": 1, + "x": 20.5, + "y": 14.5 + } + } + }, + "raw_minus_zero": [ + 6.053410470485687e-05, + 2.1085143089294434e-06, + 9.126961231231689e-07 + ] + }, + "suction": { + "speed": -0.002, + "initial_leaf": [ + 560.7500041779131, + 0.0, + 0.0 + ], + "final_leaf": [ + 560.6568783186376, + -0.014766339212656021, + -0.012467360123991966 + ], + "raw_residual": [ + 0.00033393828198313713, + 2.193264663219452e-07, + 2.6496127247810364e-07 + ], + "exact_average_residual": [ + 0.00033389730378985405, + 1.0663643479347229e-07, + 7.683411240577698e-08 + ], + "cumulative": { + "boundary": [ + -0.0934597565792501, + -0.014766445849090815, + -0.012467436958104372 + ], + "fine_transfer": [ + 0.06703074648976326, + 0.011895491741597652, + 0.010098854079842567 + ], + "coarse_transfer": [ + -0.06703078746795654, + -0.011895604431629181, + -0.01009904220700264 + ], + "rounding": [ + 0.00033393828198313713, + 2.193264663219452e-07, + 2.6496127247810364e-07 + ], + "average": [ + -4.0978193283081055e-08, + -1.126900315284729e-07, + -1.8812716007232666e-07 + ] + }, + "checks": { + "validity": true, + "geometry_unchanged": true, + "boundary_count": 48, + "collision_count": 72, + "local_collision": true, + "local_regime": true, + "bfl": true, + "transfer_rounding": true, + "interval_closure": true, + "cumulative_closure": true, + "propagation": true, + "drive_sign": true + }, + "max_collision_ratio": 0.5285112236646456, + "max_collision_error": 1.6477090769573266e-07, + "max_bfl_error": 1.2498588997100768e-08, + "max_interval_closure": 0.0, + "drive_mass": -0.07426865905109248, + "propagation": { + "coarse_interface_u": { + "threshold": 1e-06, + "baseline_factor": 10, + "first_arrival": { + "time": 7, + "signal": 4.091979903802207e-06, + "baseline": 2.0116559817931723e-07, + "absolute": 3.8910894220610345e-06, + "x": 20.5, + "y": 13.5 + }, + "peak": { + "metric": "coarse_interface_u", + "time": 14, + "signal": 0.0002878189146376881, + "baseline": 3.003423681142711e-08, + "absolute": 0.0002878487673732557, + "any_crossed": true, + "peak_crossed": true, + "x": 20.5, + "y": 15.5 + } + }, + "coarse_bulk_u": { + "threshold": 1e-06, + "baseline_factor": 10, + "first_arrival": { + "time": 8, + "signal": 1.0179867624062477e-06, + "baseline": 1.005827957173589e-07, + "absolute": 9.175116276483961e-07, + "x": 13.5, + "y": 21.5 + }, + "peak": { + "metric": "coarse_bulk_u", + "time": 16, + "signal": 0.00025644070267233306, + "baseline": 0.0, + "absolute": 0.00025644070267233306, + "any_crossed": true, + "peak_crossed": true, + "x": 21.5, + "y": 15.5 + } + }, + "fine_band_neq": { + "threshold": 1e-07, + "baseline_factor": 10, + "first_arrival": { + "time": 6, + "signal": 3.733491271140643e-07, + "baseline": 9.934099098884985e-09, + "absolute": 3.832832262129493e-07, + "x": 19.75, + "y": 13.25 + }, + "peak": { + "metric": "fine_band_neq", + "time": 10, + "signal": 7.386030289713297e-06, + "baseline": 9.106256526614231e-09, + "absolute": 7.395136546239911e-06, + "any_crossed": true, + "peak_crossed": true, + "x": 19.75, + "y": 15.25 + } + }, + "transfer_neq": { + "threshold": 1e-07, + "baseline_factor": 10, + "first_arrival": { + "time": 7, + "signal": 1.0066612778220074e-06, + "baseline": 1.4901174696935193e-08, + "absolute": 1.0215624525189426e-06, + "q": 1, + "x": 20.5, + "y": 13.5 + }, + "peak": { + "metric": "transfer_neq", + "time": 11, + "signal": 2.6241128339946074e-05, + "baseline": 8.692339972804497e-09, + "absolute": 2.623243599997327e-05, + "any_crossed": true, + "peak_crossed": true, + "q": 1, + "x": 20.5, + "y": 14.5 + } + } + }, + "raw_minus_zero": [ + 0.0001048198901116848, + -5.686189979314804e-06, + -3.6512501537799835e-06 + ] + } + } +} diff --git a/research/fine_surface_joint_20261014/review.txt b/research/fine_surface_joint_20261014/review.txt new file mode 100644 index 0000000..bbe1d8a --- /dev/null +++ b/research/fine_surface_joint_20261014/review.txt @@ -0,0 +1,36 @@ +Read-only agent review, 2026-10-14 + +/root/architecture — pre-run: +No blocking issue in hooked kernel arguments/order, masks or area weighting. +Caught CSV signal-location ambiguity and exchange-unit ambiguity before freeze: +fixed any_crossed versus peak_crossed; renamed latest_body_impulse_x/y and +latest_body_angular_impulse. No production behavior changes. + +/root/numerical — pre-run: +Avoid rho/u at partly valid halo children; transfer neq is defined at full +coarse incoming vector, actual replaced q. No double-counting average rounding. +Require independent local SRT oracle before describing measured local drift as +rounding. Freeze pointwise baseline comparisons; startup propagation may be +acoustic, not established jet advection. Suggestions incorporated before GPU. + +/root/architecture — post-run: +All frozen hashes match current sources; frozen.json digest matches gpu_run. +Freeze05:55:03 precedes launch05:55:16UTC, real exit0. Each trajectory has correct +ordered24ledger/72collision/48boundary rows; result/summary/final ledger agree. +Independently reconstructed all4metrics' per-time any_crossed/peak_crossed, +first-arrival and peaks/locations from saved signals.npz; all agree. +All text artifacts inspected within40000characters. No material gap. + +/root/numerical — post-run: +Independently summed all3ledger/collision CSVs: all components of locally +measured collision drift exactly reproduce raw global residual. Each interval +fine_transfer+coarse_transfer-average_rounding is0. Largest FP64ideal moment +defect about2.94e-14. Maximum independent local oracle normalized error.569605 +is below fixed1. Thus ledger closure is not the sole acceptance gate. +No blocking issue. Raw mass residuals2.29118e-4/2.89652e-4/3.33938e-4 remain; +identifying their FP32 source does not physically repair them or establish +strict conservation. First6/7/8 are integer sampling threshold witnesses, +not accurate propagation-speed or mature-jet/accuracy claims. + +Agents performed read-only inspection/offline data parsing, no file edits, +no GPU launch and no old regression runs. Root is the sole editor/launcher. diff --git a/research/fine_surface_joint_20261014/runner.py b/research/fine_surface_joint_20261014/runner.py new file mode 100644 index 0000000..812973a --- /dev/null +++ b/research/fine_surface_joint_20261014/runner.py @@ -0,0 +1,130 @@ +"""One launch, fresh resource guards, only owned scratch/process-group cleanup.""" +import hashlib +import json +import os +from pathlib import Path +import shutil +import signal +import subprocess +import tempfile +import time +from datetime import datetime, timezone + +ROOT = Path('/home/frank14f/CelerisLab') +OUT = Path(__file__).resolve().parent +PYTHON = '/home/frank14f/anaconda3/envs/pycuda_3_10/bin/python' +UUID = 'GPU-e8853ae7-a302-6a17-bcfa-aa767e9ed20c' + + +def command(args): + return subprocess.check_output(args, text=True, timeout=10) + + +def gpu(): + return command(['nvidia-smi', '--query-gpu=index,uuid,name,memory.used,memory.free,utilization.gpu', '--format=csv,noheader,nounits']) + + +def apps(): + return command(['nvidia-smi', '--query-compute-apps=gpu_uuid,pid,process_name,used_memory', '--format=csv,noheader,nounits']) + + +def ram(): + for line in Path('/proc/meminfo').read_text().splitlines(): + if line.startswith('MemAvailable:'): + return int(line.split()[1])*1024 + raise RuntimeError('MemAvailable unavailable') + + +def disk(paths): + return sum(p.stat().st_size for root in paths for p in root.rglob('*') if p.is_file()) + + +def group_rss(pgid): + total = 0 + for proc in Path('/proc').iterdir(): + if not proc.name.isdigit(): + continue + try: + fields = (proc/'stat').read_text().rsplit(') ', 1)[1].split() + if int(fields[2]) == pgid: + for line in (proc/'status').read_text().splitlines(): + if line.startswith('VmRSS:'): + total += int(line.split()[1])*1024 + except (OSError, ValueError, IndexError): + pass + return total + + +def main(): + assert not (OUT/'gpu_run.json').exists(), 'Do not repeat an existing launch' + data = dict(start_utc=datetime.now(timezone.utc).isoformat(), command=[PYTHON, str(OUT/'validate.py')], + cwd=str(ROOT), physical_gpu_uuid=UUID, note='Sampled guards, not an OS hard isolation; no fixed RSS/AS cap.') + scratch = None + process = None + started = time.monotonic() + code = 1 + try: + frozen = json.loads((OUT/'frozen.json').read_text()) + for path, digest in frozen['hashes'].items(): + assert hashlib.sha256((ROOT/path).read_bytes()).hexdigest() == digest, path + data['preflight_gpu'], data['preflight_apps'], data['preflight_ram_bytes'] = gpu(), apps(), ram() + fields = next(line.split(', ') for line in data['preflight_gpu'].splitlines() if UUID in line) + used, free, util = map(int, fields[-3:]) + assert fields[0] == '0' and used <= 16 and free >= 2048 and util == 0 + assert UUID not in data['preflight_apps'] and data['preflight_ram_bytes'] >= 4*1024**3 + limits = dict(wall_seconds=180, temp_bytes=2_000_000_000, + ram_reserve_bytes=max(4*1024**3, data['preflight_ram_bytes']//10), + vram_reserve_MiB=max(512, free//10)) + data['limits'] = limits + scratch = Path(tempfile.mkdtemp(prefix='celeris-joint24-')) + env = dict(PYTHONPATH=str(ROOT/'src'), PYTHONNOUSERSITE='1', PYTHONDONTWRITEBYTECODE='1', + OPENBLAS_NUM_THREADS='1', CUDA_VISIBLE_DEVICES=UUID, + CUDA_CACHE_DISABLE='1', TMPDIR=str(scratch)) + data['env'] = env + data['frozen_sha256'] = hashlib.sha256((OUT/'frozen.json').read_bytes()).hexdigest() + data['peak_group_rss_bytes'] = 0 + data['peak_temp_bytes'] = disk([OUT,scratch]) + data['min_ram_bytes'] = data['preflight_ram_bytes'] + data['min_vram_free_MiB'] = free + data['termination_reason'] = None + with (OUT/'stdout.txt').open('w') as output: + process = subprocess.Popen(data['command'], cwd=ROOT, env={**os.environ, **env}, + stdout=output, stderr=subprocess.STDOUT, start_new_session=True) + while process.poll() is None: + available, occupied = ram(), disk([OUT,scratch]) + free = int(next(line.split(', ')[-2] for line in gpu().splitlines() if UUID in line)) + data['peak_group_rss_bytes'] = max(data['peak_group_rss_bytes'], group_rss(process.pid)) + data['peak_temp_bytes'] = max(data['peak_temp_bytes'], occupied) + data['min_ram_bytes'] = min(data['min_ram_bytes'], available) + data['min_vram_free_MiB'] = min(data['min_vram_free_MiB'], free) + if (time.monotonic()-started > limits['wall_seconds'] or occupied > limits['temp_bytes'] + or available < limits['ram_reserve_bytes'] or free < limits['vram_reserve_MiB']): + data['termination_reason'] = 'Time/disk/RAM/VRAM guard triggered' + os.killpg(process.pid, signal.SIGTERM) + try: + process.wait(timeout=5) + except subprocess.TimeoutExpired: + os.killpg(process.pid, signal.SIGKILL) + break + time.sleep(.5) + code = process.wait(timeout=10) + data['postflight_gpu'], data['postflight_apps'] = gpu(), apps() + except BaseException as error: + data['runner_error'] = repr(error) + if process is not None and process.poll() is None: + os.killpg(process.pid, signal.SIGKILL) + process.wait(timeout=10) + raise + finally: + data['exit_code'] = code + data['elapsed_seconds'] = time.monotonic()-started + if scratch is not None: + shutil.rmtree(scratch) + data['scratch_removed'] = scratch is None or not scratch.exists() + (OUT/'gpu_run.json').write_text(json.dumps(data, indent=2)+'\n') + print(json.dumps(data, indent=2), flush=True) + raise SystemExit(code) + + +if __name__ == '__main__': + main() diff --git a/research/fine_surface_joint_20261014/stdout.txt b/research/fine_surface_joint_20261014/stdout.txt new file mode 100644 index 0000000..c9218e2 --- /dev/null +++ b/research/fine_surface_joint_20261014/stdout.txt @@ -0,0 +1,74 @@ +SOURCE /home/frank14f/CelerisLab/src/CelerisLab/__init__.py CRITERIA 2026-10-14T05:55:03.221284+00:00 +zero 1 raw [1.4269724488258362e-05, -1.30385160446167e-08, -1.5832483768463135e-07] cumulative_raw [1.4269724488258362e-05, -1.30385160446167e-08, -1.5832483768463135e-07] +zero 2 raw [1.7657876014709473e-06, -3.334134817123413e-07, -3.5762786865234375e-07] cumulative_raw [1.603551208972931e-05, -3.46451997756958e-07, -5.159527063369751e-07] +zero 3 raw [2.110656350851059e-05, 5.42961061000824e-07, 4.796311259269714e-07] cumulative_raw [3.71420755982399e-05, 1.9650906324386597e-07, -3.632158041000366e-08] +zero 4 raw [3.33874486386776e-05, 1.2745149433612823e-06, 1.1301599442958832e-06] cumulative_raw [7.05295242369175e-05, 1.4710240066051483e-06, 1.0938383638858795e-06] +zero 5 raw [3.5628676414489746e-05, 9.30391252040863e-07, 1.3243407011032104e-06] cumulative_raw [0.00010615820065140724, 2.4014152586460114e-06, 2.41817906498909e-06] +zero 6 raw [3.106147050857544e-05, 6.770715117454529e-07, 1.6111880540847778e-07] cumulative_raw [0.00013721967115998268, 3.0784867703914642e-06, 2.5792978703975677e-06] +zero 7 raw [2.9325950890779495e-05, 1.1133961379528046e-06, -1.9231811165809631e-07] cumulative_raw [0.00016654562205076218, 4.191882908344269e-06, 2.3869797587394714e-06] +zero 8 raw [2.0114239305257797e-05, 6.58910721540451e-07, -5.136243999004364e-07] cumulative_raw [0.00018665986135601997, 4.85079362988472e-06, 1.873355358839035e-06] +zero 9 raw [1.0494142770767212e-05, -1.434236764907837e-07, -6.081536412239075e-07] cumulative_raw [0.00019715400412678719, 4.707369953393936e-06, 1.2652017176151276e-06] +zero 10 raw [9.361188858747482e-06, -4.23286110162735e-07, 3.674067556858063e-07] cumulative_raw [0.00020651519298553467, 4.284083843231201e-06, 1.6326084733009338e-06] +zero 11 raw [1.484062522649765e-06, -1.9138678908348083e-07, 4.5029446482658386e-07] cumulative_raw [0.00020799925550818443, 4.09269705414772e-06, 2.0829029381275177e-06] +zero 12 raw [1.8295831978321075e-06, -3.227032721042633e-07, 2.8265640139579773e-07] cumulative_raw [0.00020982883870601654, 3.769993782043457e-06, 2.3655593395233154e-06] +zero 13 raw [-6.798654794692993e-08, 1.3783574104309082e-07, 2.812594175338745e-07] cumulative_raw [0.0002097608521580696, 3.907829523086548e-06, 2.64681875705719e-06] +zero 14 raw [2.5443732738494873e-06, 5.224719643592834e-07, 4.12575900554657e-07] cumulative_raw [0.0002123052254319191, 4.430301487445831e-06, 3.059394657611847e-06] +zero 15 raw [5.94649463891983e-07, 4.0745362639427185e-07, 4.66126948595047e-07] cumulative_raw [0.00021289987489581108, 4.837755113840103e-06, 3.525521606206894e-06] +zero 16 raw [3.9958395063877106e-06, 5.443580448627472e-07, 4.6798959374427795e-07] cumulative_raw [0.0002168957144021988, 5.38211315870285e-06, 3.993511199951172e-06] +zero 17 raw [4.050321877002716e-06, 3.688037395477295e-07, 3.632158041000366e-07] cumulative_raw [0.0002209460362792015, 5.75091689825058e-06, 4.3567270040512085e-06] +zero 18 raw [1.6936101019382477e-06, -5.122274160385132e-09, 2.621673047542572e-07] cumulative_raw [0.00022263964638113976, 5.745794624090195e-06, 4.618894308805466e-06] +zero 19 raw [9.485520422458649e-07, 2.3515895009040833e-07, -5.2619725465774536e-08] cumulative_raw [0.00022358819842338562, 5.980953574180603e-06, 4.566274583339691e-06] +zero 20 raw [2.483837306499481e-06, -1.3783574104309082e-07, -3.948807716369629e-07] cumulative_raw [0.0002260720357298851, 5.843117833137512e-06, 4.171393811702728e-06] +zero 21 raw [2.3888424038887024e-06, -1.4994293451309204e-07, 7.35744833946228e-08] cumulative_raw [0.0002284608781337738, 5.69317489862442e-06, 4.244968295097351e-06] +zero 22 raw [1.9418075680732727e-07, -1.5040859580039978e-07, -4.3259933590888977e-07] cumulative_raw [0.00022865505889058113, 5.54276630282402e-06, 3.8123689591884613e-06] +zero 23 raw [2.3739412426948547e-06, 1.8440186977386475e-07, -1.0058283805847168e-07] cumulative_raw [0.00023102900013327599, 5.727168172597885e-06, 3.7117861211299896e-06] +zero 24 raw [-1.910608261823654e-06, 1.7834827303886414e-07, 2.0442530512809753e-07] cumulative_raw [0.00022911839187145233, 5.905516445636749e-06, 3.916211426258087e-06] +blow 1 raw [1.4206860214471817e-05, 3.259629011154175e-09, -1.6624107956886292e-07] cumulative_raw [1.4206860214471817e-05, 3.259629011154175e-09, -1.6624107956886292e-07] +blow 2 raw [1.7564743757247925e-06, -3.6135315895080566e-07, -4.200264811515808e-07] cumulative_raw [1.596333459019661e-05, -3.580935299396515e-07, -5.862675607204437e-07] +blow 3 raw [2.1332409232854843e-05, 4.530884325504303e-07, 4.3353065848350525e-07] cumulative_raw [3.729574382305145e-05, 9.499490261077881e-08, -1.5273690223693848e-07] +blow 4 raw [3.517419099807739e-05, 1.0030344128608704e-06, 8.512288331985474e-07] cumulative_raw [7.246993482112885e-05, 1.0980293154716492e-06, 6.984919309616089e-07] +blow 5 raw [3.396905958652496e-05, 4.414469003677368e-07, 8.614733815193176e-07] cumulative_raw [0.00010643899440765381, 1.539476215839386e-06, 1.5599653124809265e-06] +blow 6 raw [2.455664798617363e-05, 4.1676685214042664e-07, 6.193295121192932e-08] cumulative_raw [0.00013099564239382744, 1.9562430679798126e-06, 1.6218982636928558e-06] +blow 7 raw [2.177571877837181e-05, 7.790513336658478e-07, -3.3760443329811096e-07] cumulative_raw [0.00015277136117219925, 2.7352944016456604e-06, 1.2842938303947449e-06] +blow 8 raw [1.2828968465328217e-05, 8.996576070785522e-07, -5.951151251792908e-07] cumulative_raw [0.00016560032963752747, 3.6349520087242126e-06, 6.891787052154541e-07] +blow 9 raw [8.143018931150436e-06, -6.007030606269836e-08, -6.831251084804535e-07] cumulative_raw [0.0001737433485686779, 3.5748817026615143e-06, 6.05359673500061e-09] +blow 10 raw [8.094590157270432e-06, -4.5588240027427673e-07, 2.6868656277656555e-07] cumulative_raw [0.00018183793872594833, 3.1189993023872375e-06, 2.7474015951156616e-07] +blow 11 raw [4.441943019628525e-06, -1.816079020500183e-08, 2.3329630494117737e-07] cumulative_raw [0.00018627988174557686, 3.1008385121822357e-06, 5.080364644527435e-07] +blow 12 raw [6.674323230981827e-06, -4.139728844165802e-07, 1.0943040251731873e-07] cumulative_raw [0.00019295420497655869, 2.6868656277656555e-06, 6.174668669700623e-07] +blow 13 raw [3.2545067369937897e-06, 4.810281097888947e-07, 5.620531737804413e-07] cumulative_raw [0.00019620871171355247, 3.16789373755455e-06, 1.1795200407505035e-06] +blow 14 raw [5.840323865413666e-06, 2.4586915969848633e-07, 4.3213367462158203e-07] cumulative_raw [0.00020204903557896614, 3.4137628972530365e-06, 1.6116537153720856e-06] +blow 15 raw [3.4989789128303528e-06, -1.3690441846847534e-07, 1.9744038581848145e-07] cumulative_raw [0.0002055480144917965, 3.276858478784561e-06, 1.809094101190567e-06] +blow 16 raw [7.721595466136932e-06, -6.09084963798523e-07, 1.825392246246338e-07] cumulative_raw [0.00021326960995793343, 2.667773514986038e-06, 1.991633325815201e-06] +blow 17 raw [7.1446411311626434e-06, -5.96512109041214e-07, -3.841705620288849e-07] cumulative_raw [0.00022041425108909607, 2.0712614059448242e-06, 1.607462763786316e-06] +blow 18 raw [6.80144876241684e-06, -5.504116415977478e-07, -4.200264811515808e-07] cumulative_raw [0.0002272156998515129, 1.5208497643470764e-06, 1.1874362826347351e-06] +blow 19 raw [9.258277714252472e-06, 2.1606683731079102e-07, 1.1175870895385742e-08] cumulative_raw [0.00023647397756576538, 1.7369166016578674e-06, 1.1986121535301208e-06] +blow 20 raw [8.094590157270432e-06, 6.710179150104523e-07, -1.816079020500183e-08] cumulative_raw [0.0002445685677230358, 2.4079345166683197e-06, 1.180451363325119e-06] +blow 21 raw [8.198432624340057e-06, 1.2507662177085876e-06, 6.873160600662231e-07] cumulative_raw [0.00025276700034737587, 3.6587007343769073e-06, 1.8677674233913422e-06] +blow 22 raw [8.822884410619736e-06, 1.978594809770584e-06, 1.3136304914951324e-06] cumulative_raw [0.0002615898847579956, 5.6372955441474915e-06, 3.1813979148864746e-06] +blow 23 raw [1.5878118574619293e-05, 1.6177073121070862e-06, 1.0365620255470276e-06] cumulative_raw [0.0002774680033326149, 7.255002856254578e-06, 4.217959940433502e-06] +blow 24 raw [1.2184493243694305e-05, 7.59027898311615e-07, 6.109476089477539e-07] cumulative_raw [0.0002896524965763092, 8.014030754566193e-06, 4.828907549381256e-06] +suction 1 raw [1.4393124729394913e-05, -4.516914486885071e-08, -1.587904989719391e-07] cumulative_raw [1.4393124729394913e-05, -4.516914486885071e-08, -1.587904989719391e-07] +suction 2 raw [2.2295862436294556e-06, -3.855675458908081e-07, -3.7997961044311523e-07] cumulative_raw [1.6622710973024368e-05, -4.307366907596588e-07, -5.387701094150543e-07] +suction 3 raw [2.245372161269188e-05, 5.573965609073639e-07, 4.1583552956581116e-07] cumulative_raw [3.907643258571625e-05, 1.2665987014770508e-07, -1.2293457984924316e-07] +suction 4 raw [3.50000336766243e-05, 1.1008232831954956e-06, 9.220093488693237e-07] cumulative_raw [7.407646626234055e-05, 1.2274831533432007e-06, 7.990747690200806e-07] +suction 5 raw [3.477558493614197e-05, 4.079192876815796e-07, 8.763745427131653e-07] cumulative_raw [0.00010885205119848251, 1.6354024410247803e-06, 1.6754493117332458e-06] +suction 6 raw [2.6892870664596558e-05, 4.9639493227005e-07, 3.129243850708008e-07] cumulative_raw [0.00013574492186307907, 2.1317973732948303e-06, 1.9883736968040466e-06] +suction 7 raw [2.290075644850731e-05, 7.67875462770462e-07, -2.7334317564964294e-07] cumulative_raw [0.00015864567831158638, 2.8996728360652924e-06, 1.7150305211544037e-06] +suction 8 raw [1.7298851162195206e-05, 5.350448191165924e-07, -6.384216248989105e-07] cumulative_raw [0.00017594452947378159, 3.4347176551818848e-06, 1.0766088962554932e-06] +suction 9 raw [1.0765623301267624e-05, -4.884786903858185e-07, -7.119961082935333e-07] cumulative_raw [0.0001867101527750492, 2.9462389647960663e-06, 3.6461278796195984e-07] +suction 10 raw [1.1249445378780365e-05, -3.1944364309310913e-07, -5.587935447692871e-08] cumulative_raw [0.00019795959815382957, 2.626795321702957e-06, 3.0873343348503113e-07] +suction 11 raw [4.750210791826248e-06, 1.7741695046424866e-07, 1.1781230568885803e-07] cumulative_raw [0.00020270980894565582, 2.804212272167206e-06, 4.2654573917388916e-07] +suction 12 raw [9.55536961555481e-06, 2.0582228899002075e-07, 2.3096799850463867e-07] cumulative_raw [0.00021226517856121063, 3.0100345611572266e-06, 6.575137376785278e-07] +suction 13 raw [5.227979272603989e-06, -2.612359821796417e-07, 1.3830140233039856e-07] cumulative_raw [0.00021749315783381462, 2.748798578977585e-06, 7.958151400089264e-07] +suction 14 raw [7.559079676866531e-06, 1.9045546650886536e-07, -3.958120942115784e-08] cumulative_raw [0.00022505223751068115, 2.93925404548645e-06, 7.562339305877686e-07] +suction 15 raw [9.032431989908218e-06, 9.452924132347107e-08, 1.5133991837501526e-07] cumulative_raw [0.00023408466950058937, 3.0337832868099213e-06, 9.075738489627838e-07] +suction 16 raw [7.634051144123077e-06, 5.690380930900574e-07, 1.5832483768463135e-07] cumulative_raw [0.00024171872064471245, 3.6028213798999786e-06, 1.0658986866474152e-06] +suction 17 raw [1.00662000477314e-05, 8.973293006420135e-07, 7.557682693004608e-07] cumulative_raw [0.00025178492069244385, 4.500150680541992e-06, 1.821666955947876e-06] +suction 18 raw [1.0185874998569489e-05, 4.6193599700927734e-07, 2.8219074010849e-07] cumulative_raw [0.00026197079569101334, 4.9620866775512695e-06, 2.103857696056366e-06] +suction 19 raw [1.1193566024303436e-05, 1.1734664440155029e-07, 6.249174475669861e-07] cumulative_raw [0.00027316436171531677, 5.07943332195282e-06, 2.728775143623352e-06] +suction 20 raw [1.0485295206308365e-05, -3.543682396411896e-07, -2.230517566204071e-07] cumulative_raw [0.00028364965692162514, 4.72506508231163e-06, 2.505723387002945e-06] +suction 21 raw [1.1485535651445389e-05, -1.1255033314228058e-06, -5.471520125865936e-07] cumulative_raw [0.0002951351925730705, 3.5995617508888245e-06, 1.9585713744163513e-06] +suction 22 raw [9.597279131412506e-06, -1.80024653673172e-06, -1.0225921869277954e-06] cumulative_raw [0.00030473247170448303, 1.7993152141571045e-06, 9.359791874885559e-07] +suction 23 raw [1.4128629118204117e-05, -1.010950654745102e-06, -6.859190762042999e-07] cumulative_raw [0.00031886110082268715, 7.883645594120026e-07, 2.50060111284256e-07] +suction 24 raw [1.5077181160449982e-05, -5.690380930900574e-07, 1.4901161193847656e-08] cumulative_raw [0.00033393828198313713, 2.193264663219452e-07, 2.6496127247810364e-07] +RESULT {"passed": true, "summaries": {"zero": {"speed": 0.0, "initial_leaf": [560.7500041779131, 0.0, 0.0], "final_leaf": [560.7502328557894, 4.124827682971954e-06, 3.1795352697372437e-06], "raw_residual": [0.00022911839187145233, 5.905516445636749e-06, 3.916211426258087e-06], "exact_average_residual": [0.00022854655981063843, 5.717389285564423e-06, 3.6330893635749817e-06], "cumulative": {"boundary": [1.3131648302078247e-07, -1.5925616025924683e-06, -4.5355409383773804e-07], "fine_transfer": [-9.47713851928711e-05, 3.1068921089172363e-06, -2.084299921989441e-06], "coarse_transfer": [9.419955313205719e-05, -3.295019268989563e-06, 1.8011778593063354e-06], "rounding": [0.00022911839187145233, 5.905516445636749e-06, 3.916211426258087e-06], "average": [-5.718320608139038e-07, -1.8812716007232666e-07, -2.8312206268310547e-07]}, "checks": {"validity": true, "geometry_unchanged": true, "boundary_count": 48, "collision_count": 72, "local_collision": true, "local_regime": true, "bfl": true, "transfer_rounding": true, "interval_closure": true, "cumulative_closure": true}, "max_collision_ratio": 0.46394191845799526, "max_collision_error": 1.2914339875269576e-07, "max_bfl_error": 1.0332863675799331e-08, "max_interval_closure": 0.0, "drive_mass": 3.733417470608985e-07}, "blow": {"speed": 0.002, "initial_leaf": [560.7500041779131, 0.0, 0.0], "final_leaf": [560.8438616539352, 0.014835720416158438, 0.012527641374617815], "raw_residual": [0.0002896524965763092, 8.014030754566193e-06, 4.828907549381256e-06], "exact_average_residual": [0.00028958916664123535, 7.874332368373871e-06, 4.7245994210243225e-06], "cumulative": {"boundary": [0.09356788685545325, 0.014827846083790064, 0.01252291677519679], "fine_transfer": [-0.0672332551330328, -0.01191190630197525, -0.010114157572388649], "coarse_transfer": [0.06723319180309772, 0.011911766603589058, 0.010114053264260292], "rounding": [0.0002896524965763092, 8.014030754566193e-06, 4.828907549381256e-06], "average": [-6.332993507385254e-08, -1.3969838619232178e-07, -1.043081283569336e-07]}, "checks": {"validity": true, "geometry_unchanged": true, "boundary_count": 48, "collision_count": 72, "local_collision": true, "local_regime": true, "bfl": true, "transfer_rounding": true, "interval_closure": true, "cumulative_closure": true, "propagation": true, "drive_sign": true}, "max_collision_ratio": 0.5696050037738337, "max_collision_error": 1.5865499780609582e-07, "max_bfl_error": 1.2725840020655355e-08, "max_interval_closure": 0.0, "drive_mass": 0.07436401406617413, "propagation": {"coarse_interface_u": {"threshold": 1e-06, "baseline_factor": 10, "first_arrival": {"time": 7, "signal": 4.0664670353703905e-06, "baseline": 2.0116559817931723e-07, "absolute": 4.267265792606936e-06, "x": 20.5, "y": 13.5}, "peak": {"metric": "coarse_interface_u", "time": 14, "signal": 0.00028850325159438407, "baseline": 3.003423681142711e-08, "absolute": 0.00028847339892346693, "any_crossed": true, "peak_crossed": true, "x": 20.5, "y": 15.5}}, "coarse_bulk_u": {"threshold": 1e-06, "baseline_factor": 10, "first_arrival": {"time": 8, "signal": 1.1069172403255332e-06, "baseline": 1.005827957173589e-07, "absolute": 1.2074577299858699e-06, "x": 13.5, "y": 21.5}, "peak": {"metric": "coarse_bulk_u", "time": 16, "signal": 0.00025699080829703886, "baseline": 0.0, "absolute": 0.00025699080829703886, "any_crossed": true, "peak_crossed": true, "x": 21.5, "y": 15.5}}, "fine_band_neq": {"threshold": 1e-07, "baseline_factor": 10, "first_arrival": {"time": 6, "signal": 3.8661114470928126e-07, "baseline": 9.934099098884985e-09, "absolute": 3.766770456103963e-07, "x": 19.75, "y": 13.25}, "peak": {"metric": "fine_band_neq", "time": 10, "signal": 7.498180437826019e-06, "baseline": 9.106256526614231e-09, "absolute": 7.489074181299404e-06, "any_crossed": true, "peak_crossed": true, "x": 19.75, "y": 15.25}}, "transfer_neq": {"threshold": 1e-07, "baseline_factor": 10, "first_arrival": {"time": 7, "signal": 9.917490157301811e-07, "baseline": 1.4901174696935193e-08, "absolute": 9.76847841033246e-07, "q": 1, "x": 20.5, "y": 13.5}, "peak": {"metric": "transfer_neq", "time": 11, "signal": 2.6366830318105827e-05, "baseline": 8.692339972804497e-09, "absolute": 2.6375522658078632e-05, "any_crossed": true, "peak_crossed": true, "q": 1, "x": 20.5, "y": 14.5}}}, "raw_minus_zero": [6.053410470485687e-05, 2.1085143089294434e-06, 9.126961231231689e-07]}, "suction": {"speed": -0.002, "initial_leaf": [560.7500041779131, 0.0, 0.0], "final_leaf": [560.6568783186376, -0.014766339212656021, -0.012467360123991966], "raw_residual": [0.00033393828198313713, 2.193264663219452e-07, 2.6496127247810364e-07], "exact_average_residual": [0.00033389730378985405, 1.0663643479347229e-07, 7.683411240577698e-08], "cumulative": {"boundary": [-0.0934597565792501, -0.014766445849090815, -0.012467436958104372], "fine_transfer": [0.06703074648976326, 0.011895491741597652, 0.010098854079842567], "coarse_transfer": [-0.06703078746795654, -0.011895604431629181, -0.01009904220700264], "rounding": [0.00033393828198313713, 2.193264663219452e-07, 2.6496127247810364e-07], "average": [-4.0978193283081055e-08, -1.126900315284729e-07, -1.8812716007232666e-07]}, "checks": {"validity": true, "geometry_unchanged": true, "boundary_count": 48, "collision_count": 72, "local_collision": true, "local_regime": true, "bfl": true, "transfer_rounding": true, "interval_closure": true, "cumulative_closure": true, "propagation": true, "drive_sign": true}, "max_collision_ratio": 0.5285112236646456, "max_collision_error": 1.6477090769573266e-07, "max_bfl_error": 1.2498588997100768e-08, "max_interval_closure": 0.0, "drive_mass": -0.07426865905109248, "propagation": {"coarse_interface_u": {"threshold": 1e-06, "baseline_factor": 10, "first_arrival": {"time": 7, "signal": 4.091979903802207e-06, "baseline": 2.0116559817931723e-07, "absolute": 3.8910894220610345e-06, "x": 20.5, "y": 13.5}, "peak": {"metric": "coarse_interface_u", "time": 14, "signal": 0.0002878189146376881, "baseline": 3.003423681142711e-08, "absolute": 0.0002878487673732557, "any_crossed": true, "peak_crossed": true, "x": 20.5, "y": 15.5}}, "coarse_bulk_u": {"threshold": 1e-06, "baseline_factor": 10, "first_arrival": {"time": 8, "signal": 1.0179867624062477e-06, "baseline": 1.005827957173589e-07, "absolute": 9.175116276483961e-07, "x": 13.5, "y": 21.5}, "peak": {"metric": "coarse_bulk_u", "time": 16, "signal": 0.00025644070267233306, "baseline": 0.0, "absolute": 0.00025644070267233306, "any_crossed": true, "peak_crossed": true, "x": 21.5, "y": 15.5}}, "fine_band_neq": {"threshold": 1e-07, "baseline_factor": 10, "first_arrival": {"time": 6, "signal": 3.733491271140643e-07, "baseline": 9.934099098884985e-09, "absolute": 3.832832262129493e-07, "x": 19.75, "y": 13.25}, "peak": {"metric": "fine_band_neq", "time": 10, "signal": 7.386030289713297e-06, "baseline": 9.106256526614231e-09, "absolute": 7.395136546239911e-06, "any_crossed": true, "peak_crossed": true, "x": 19.75, "y": 15.25}}, "transfer_neq": {"threshold": 1e-07, "baseline_factor": 10, "first_arrival": {"time": 7, "signal": 1.0066612778220074e-06, "baseline": 1.4901174696935193e-08, "absolute": 1.0215624525189426e-06, "q": 1, "x": 20.5, "y": 13.5}, "peak": {"metric": "transfer_neq", "time": 11, "signal": 2.6241128339946074e-05, "baseline": 8.692339972804497e-09, "absolute": 2.623243599997327e-05, "any_crossed": true, "peak_crossed": true, "q": 1, "x": 20.5, "y": 14.5}}}, "raw_minus_zero": [0.0001048198901116848, -5.686189979314804e-06, -3.6512501537799835e-06]}}} diff --git a/research/fine_surface_joint_20261014/suction_boundary.csv b/research/fine_surface_joint_20261014/suction_boundary.csv new file mode 100644 index 0000000..b870be0 --- /dev/null +++ b/research/fine_surface_joint_20261014/suction_boundary.csv @@ -0,0 +1,49 @@ +step,substep,time,bfl_error,drive_mass,latest_body_impulse_x,latest_body_impulse_y,latest_body_angular_impulse,boundary_m,boundary_px,boundary_py,fine_transfer_m,fine_transfer_px,fine_transfer_py +1,1,0.5,3.7331066016221826e-09,-0.0015482641756534576,0.0010669892653822899,0.0009111212566494942,1.329833948571224e-05,-0.0015482641756534576,-0.0010669846087694168,-0.0009111212566494942,0.0,0.0,0.0 +1,2,1.0,7.450580596923828e-09,-0.001546488821844781,0.0005881106480956078,0.0005055302754044533,7.090981909652072e-06,-0.0018966365605592728,-0.000588112510740757,-0.0005055312067270279,-3.557652235031128e-07,0.0,0.0 +2,1,1.5,7.450580596923828e-09,-0.0015455698188904868,0.0007474450394511223,0.000630686990916729,6.323601846380811e-06,-0.0017942930571734905,-0.0007474464364349842,-0.0006306902505457401,-8.530914783477783e-07,-7.450580596923828e-09,-1.6763806343078613e-07 +2,2,2.0,7.450580596923828e-09,-0.0015454305605910922,0.0006957640871405602,0.0005812598392367363,-9.326976928458741e-06,-0.0019257990643382072,-0.0006957687437534332,-0.0005812682211399078,-1.3401731848716736e-06,2.7939677238464355e-09,-9.313225746154785e-10 +3,1,2.5,7.450580596923828e-09,-0.0015454182331193405,0.0007162690162658691,0.0006032083183526993,2.0262676536653146e-06,-0.0019086366519331932,-0.0007162792608141899,-0.0006032129749655724,-1.6577541828155518e-06,1.5832483768463135e-07,1.5832483768463135e-07 +3,2,3.0,8.221284986120736e-09,-0.0015455955498631406,0.000675516203045845,0.0005694478750228882,-2.283530538660372e-06,-0.0019611637108027935,-0.0006755241192877293,-0.0005694576539099216,-1.982320100069046e-06,3.1152740120887756e-07,3.096647560596466e-07 +4,1,3.5,7.450580596923828e-09,-0.0015457821940822736,0.0006534429267048836,0.000552385114133358,3.1464089307320364e-06,-0.001949384342879057,-0.0006534415297210217,-0.000552391167730093,-3.2121315598487854e-06,3.5297125577926636e-07,3.762543201446533e-07 +4,2,4.0,7.450580596923828e-09,-0.0015460265831878312,0.0006101150065660477,0.0005156379193067551,2.1656969761973954e-07,-0.001972564961761236,-0.000610120128840208,-0.0005156439729034901,-3.698747605085373e-06,-3.585591912269592e-08,1.909211277961731e-08 +5,1,4.5,7.450580596923828e-09,-0.0015462236236817618,0.0005800491198897362,0.0004902100190520287,2.4401852956046355e-06,-0.0019627874717116356,-0.0005800472572445869,-0.0004902174696326256,-3.6563724279403687e-06,5.550682544708252e-07,2.4121254682540894e-07 +5,2,5.0,8.17224322935406e-09,-0.001546429669342637,0.0005416562780737877,0.00045779068022966385,6.411905253411732e-07,-0.0019741454161703587,-0.0005416539497673512,-0.000457793939858675,-3.6312267184257507e-06,5.122274160385132e-07,2.2258609533309937e-07 +6,1,5.5,7.450580596923828e-09,-0.0015465991853560995,0.0005121780559420586,0.00043242890387773514,1.926527342988038e-06,-0.001966074574738741,-0.0005121775902807713,-0.000432425644248724,-2.8940849006175995e-06,5.164183676242828e-07,3.213062882423401e-08 +6,2,6.0,1.0613033563089402e-08,-0.001546759810737387,0.00047842320054769516,0.00040392857044935226,7.323118594859679e-07,-0.001972377300262451,-0.0004784250631928444,-0.00040392763912677765,-2.0721927285194397e-06,6.435438990592957e-07,9.12696123123169e-08 +7,1,6.5,7.450580596923828e-09,-0.0015468885373133533,0.00045062508434057236,0.0003800736740231514,1.5839877249845813e-06,-0.0019662114791572094,-0.0004506339319050312,-0.00038006948307156563,2.334360033273697e-06,3.114808350801468e-06,1.4849938452243805e-06 +7,2,7.0,8.999190503899968e-09,-0.0015470132347384351,0.00042080413550138474,0.0003548497334122658,8.012649583832854e-07,-0.0019701728597283363,-0.0004208004102110863,-0.00035485532134771347,1.5432480722665787e-05,1.1287163943052292e-05,5.935784429311752e-06 +8,1,7.5,1.0738867337045654e-08,-0.0015471137993936443,0.0003952737897634506,0.00033300556242465973,1.388882160391347e-06,-0.0019654585048556328,-0.0003952831029891968,-0.0003329990431666374,5.064625293016434e-05,2.6551075279712677e-05,1.5786848962306976e-05 +8,2,8.0,7.94032639639397e-09,-0.0015472117748432483,0.00036898814141750336,0.00031079165637493134,8.204820101109789e-07,-0.0019681239500641823,-0.0003689778968691826,-0.0003107842057943344,0.00010942388325929642,6.19497150182724e-05,3.8951635360717773e-05 +9,1,8.5,8.976009713279609e-09,-0.0015472804270270975,0.00034602265805006027,0.0002911807969212532,1.3696224959725e-06,-0.001964463386684656,-0.0003460417501628399,-0.00029119057580828667,0.0002314508892595768,9.650783613324165e-05,6.443960592150688e-05 +9,2,9.0,1.0052167986884797e-08,-0.001547337366734857,0.00032305438071489334,0.0002718055620789528,8.737507810607781e-07,-0.00196637911722064,-0.00032305577769875526,-0.0002718069590628147,0.0003751874901354313,0.00017973734065890312,0.00012484891340136528 +10,1,9.5,7.4023787099974925e-09,-0.001547404346943595,0.00030282605439424515,0.0002545500174164772,1.3337265093449346e-06,-0.0019635148346424103,-0.00030282698571681976,-0.00025455933064222336,0.0006195390596985817,0.00022383593022823334,0.000162455253303051 +10,2,10.0,6.968939966767174e-09,-0.001547448671976346,0.0002828845754265785,0.00023786630481481552,9.501839344228102e-07,-0.001965020317584276,-0.00028289156034588814,-0.00023785652592778206,0.0008522137068212032,0.00035300618037581444,0.0002658138982951641 +11,1,10.5,1.0530962046839676e-08,-0.0015474870615136364,0.00026516150683164597,0.00022298935800790787,1.3016631345008634e-06,-0.0019626920111477375,-0.00026516104117035866,-0.00022298330441117287,0.0011819470673799515,0.0003880225121974945,0.00030118972063064575 +11,2,11.0,7.354702624695619e-09,-0.0015475354224584415,0.0002481304109096527,0.00020870380103588104,8.941672690054858e-07,-0.0019638948142528534,-0.00024813972413539886,-0.00020870286971330643,0.00145752914249897,0.0005337242037057877,0.00042963773012161255 +12,1,11.5,8.767222503536232e-09,-0.001547562607513273,0.00023286882787942886,0.00019576307386159897,1.1601679523742803e-06,-0.001962078735232353,-0.0002328716218471527,-0.00019576400518417358,0.0017802291549742222,0.0005506309680640697,0.00045162299647927284 +12,2,12.0,9.096382980189333e-09,-0.0015476002059964218,0.00021828524768352509,0.00018361210823059082,8.859918445569548e-07,-0.0019631017930805683,-0.00021829502657055855,-0.00018362188711762428,0.002031440380960703,0.0006739604286849499,0.000572004821151495 +13,1,12.5,6.5197561377461355e-09,-0.0015476129016728998,0.00020523089915513992,0.00017269793897867203,1.2139267550059785e-06,-0.0019616251811385155,-0.00020523276180028915,-0.00017269421368837357,0.0022674263454973698,0.00067532854154706,0.0005780183710157871 +13,2,13.0,5.146194359539891e-09,-0.0015476392796307777,0.00019292067736387253,0.00016248133033514023,9.107929975771256e-07,-0.0019624661654233932,-0.0001929309219121933,-0.0001624850556254387,0.002446614671498537,0.0007499088533222675,0.0006604096852242947 +14,1,13.5,8.330306375259333e-09,-0.0015476535128897996,0.0001819990575313568,0.00015316344797611237,1.1346972110803932e-06,-0.0019612740725278854,-0.0001819925382733345,-0.00015317555516958237,0.0025721797719597816,0.0007412796840071678,0.0006537484005093575 +14,2,14.0,8.454041688921166e-09,-0.0015476762461938956,0.00017176009714603424,0.00014458410441875458,9.925571977653647e-07,-0.0019619660452008247,-0.00017175264656543732,-0.0001445794478058815,0.0026705721393227577,0.000760519877076149,0.0006827609613537788 +15,1,14.5,8.024249306681774e-09,-0.0015476863880568553,0.0001627029851078987,0.00013693515211343765,1.1326488877916319e-06,-0.0019609066657721996,-0.00016270345076918602,-0.00013692351058125496,0.0027098902501165867,0.0007453667931258678,0.0006675352342426777 +15,2,15.0,8.5509712643983e-09,-0.0015477023138736976,0.00015427079051733017,0.0001298980787396431,1.0080659256228586e-06,-0.0019614454358816147,-0.00015425775200128555,-0.00012989435344934464,0.0027480190619826317,0.0007168371230363846,0.0006446875631809235 +16,1,15.5,1.2498588997100768e-08,-0.0015477122014419843,0.0001468295231461525,0.000123598612844944,1.1824087963185903e-06,-0.001960494089871645,-0.00014683278277516365,-0.000123604666441679,0.002740874420851469,0.0006989189423620701,0.000626422930508852 +16,2,16.0,9.256705402194143e-09,-0.0015477301148594871,0.00014006812125444412,0.00011796411126852036,9.308136234009723e-07,-0.0019609369337558746,-0.00014007184654474258,-0.00011796131730079651,0.002747458405792713,0.0006359582766890526,0.0005640769377350807 +17,1,16.5,9.86708736938624e-09,-0.0015477351078586202,0.00013425014913082123,0.00011301040649414062,1.1052945718681428e-06,-0.001960096415132284,-0.0001342552714049816,-0.0001130090095102787,0.002724500373005867,0.0006184643134474754,0.0005468325689435005 +17,2,17.0,8.028477438415393e-09,-0.0015477600973967448,0.00012889597564935684,0.00010859500616788864,9.277017700703993e-07,-0.001960489433258772,-0.0001288936473429203,-0.00010859174653887749,0.0027201655320823193,0.0005353703163564205,0.00046224379912018776 +18,1,17.5,7.699842763386755e-09,-0.0015477556081742207,0.00012428779155015945,0.00010465551167726517,1.036442421664674e-06,-0.00195977371186018,-0.0001242849975824356,-0.00010466109961271286,0.0026930058375000954,0.0005191462114453316,0.0004479791969060898 +18,2,18.0,7.779478172764698e-09,-0.0015477652772308585,0.00011980719864368439,0.00010108202695846558,9.591615347526172e-07,-0.001960138790309429,-0.00011981278657913208,-0.0001010717824101448,0.0026853615418076515,0.00042929593473672867,0.0003578970208764076 +19,1,18.5,1.0115823734224705e-08,-0.0015477747316547663,0.00011577177792787552,9.778235107660294e-05,1.1382919499203226e-06,-0.001959627028554678,-0.00011577224358916283,-9.777536615729332e-05,0.002648819237947464,0.0004100445657968521,0.0003434009850025177 +19,2,19.0,9.594118610678493e-09,-0.0015477738185972504,0.00011185649782419205,9.45916399359703e-05,8.908682038732962e-07,-0.0019600135274231434,-0.0001118597574532032,-9.458651766180992e-05,0.0026350892148911953,0.0003254576586186886,0.00026165833696722984 +20,1,19.5,8.744199350707582e-09,-0.0015477812550560438,0.00010816752910614014,9.154155850410461e-05,1.0807081907149296e-06,-0.001959587913006544,-0.0001081652007997036,-9.154481813311577e-05,0.0025749970227479935,0.0002942616119980812,0.00023942533880472183 +20,2,20.0,7.241793387180451e-09,-0.0015478027222764852,0.00010451860725879669,8.863583207130432e-05,9.283607647070369e-07,-0.0019599981606006622,-0.00010452233254909515,-8.862745016813278e-05,0.002547156997025013,0.00022500474005937576,0.0001754332333803177 +21,1,20.5,9.080666218963529e-09,-0.0015478099147822168,0.00010123103857040405,8.586794137954712e-05,1.0566826715852073e-06,-0.0019596004858613014,-0.00010123662650585175,-8.586607873439789e-05,0.0024467245675623417,0.0001708432100713253,0.0001354874111711979 +21,2,21.0,8.309436028142159e-09,-0.001547811782321707,9.799562394618988e-05,8.317828178405762e-05,9.359370445327642e-07,-0.0019598989747464657,-9.798770770430565e-05,-8.317967876791954e-05,0.0023957067169249058,0.0001242239959537983,9.476905688643456e-05 +22,1,21.5,8.807171658631319e-09,-0.0015478071837582907,9.528174996376038e-05,8.07885080575943e-05,1.0299947542646848e-06,-0.001959493849426508,-9.528035297989845e-05,-8.077593520283699e-05,0.0022453111596405506,3.82973812520504e-05,2.8362032026052475e-05 +22,2,22.0,7.708700941466695e-09,-0.0015478350620986127,9.280815720558167e-05,7.856637239456177e-05,9.84289633354507e-07,-0.0019597294740378857,-9.280489757657051e-05,-7.857801392674446e-05,0.0021656760945916176,1.8442049622535706e-05,1.2994743883609772e-05 +23,1,22.5,5.829010607527607e-09,-0.0015478298144738873,9.077228605747223e-05,7.675401866436005e-05,1.0561968476485717e-06,-0.0019593103788793087,-9.077740833163261e-05,-7.675448432564735e-05,0.001967994961887598,-0.00010093534365296364,-8.322251960635185e-05 +23,2,23.0,1.00678847481106e-08,-0.0015478396129139588,8.917506784200668e-05,7.518846541643143e-05,9.189075473869934e-07,-0.001959436573088169,-8.916761726140976e-05,-7.51987099647522e-05,0.0018595317378640175,-9.398628026247025e-05,-7.435213774442673e-05 +24,1,23.5,9.096645881001564e-09,-0.0015478476094394076,8.79606232047081e-05,7.397029548883438e-05,9.397743796490943e-07,-0.0019590607844293118,-8.79545696079731e-05,-7.396889850497246e-05,0.0016328254714608192,-0.00023874826729297638,-0.00019633769989013672 +24,2,24.0,8.815424390462567e-09,-0.001547844811637395,8.694268763065338e-05,7.304549217224121e-05,9.335749210359623e-07,-0.001959147397428751,-8.693570271134377e-05,-7.305433973670006e-05,0.0015028249472379684,-0.0002091461792588234,-0.00016683153808116913 diff --git a/research/fine_surface_joint_20261014/suction_collisions.csv b/research/fine_surface_joint_20261014/suction_collisions.csv new file mode 100644 index 0000000..2de48c0 --- /dev/null +++ b/research/fine_surface_joint_20261014/suction_collisions.csv @@ -0,0 +1,73 @@ +step,level,substep,max_error,max_ratio,regime,drift_m,drift_px,drift_py,ideal_defect_m,ideal_defect_px,ideal_defect_py,measured_rounding_m,measured_rounding_px,measured_rounding_py +1,fine,1,8.229037262719174e-08,0.3569820693406681,True,1.626182347536087e-05,-3.3527612686157227e-08,-1.7695128917694092e-08,-3.0010716134398763e-16,-1.214306433183765e-17,-1.734723475976807e-18,1.6261823475660978e-05,-3.352761267401416e-08,-1.7695128915959368e-08 +1,fine,2,5.173531247848473e-08,0.2677766155245442,True,-3.394670784473419e-07,1.3969838619232178e-09,1.7229467630386353e-08,-5.745404152435185e-15,-1.0408340855860843e-17,5.898059818321144e-17,-3.3946707270193777e-07,1.3969838723315586e-09,1.7229467571405754e-08 +1,coarse,1,1.1080350609260492e-08,0.10456730670501622,True,-1.5292316675186157e-06,-1.30385160446167e-08,-1.5832483768463135e-07,-4.288236432614667e-15,-5.551115123125783e-17,1.3877787807814457e-17,-1.5292316632303793e-06,-1.3038515989105548e-08,-1.5832483769850914e-07 +2,fine,1,9.892327201832529e-08,0.29769478490638285,True,9.881332516670227e-07,-3.3527612686157227e-08,-1.993030309677124e-07,-5.195496810550537e-15,-2.949029909160572e-17,2.1337098754514727e-16,9.881332568625195e-07,-3.352761265666693e-08,-1.993030311810834e-07 +2,fine,2,8.832159215099722e-08,0.3121116042355555,True,2.668239176273346e-06,-4.284083843231201e-08,1.2852251529693604e-07,-1.1539380562197721e-14,-1.457167719820518e-16,2.2898349882893854e-16,2.6682391878127265e-06,-4.284083828659524e-08,1.2852251506795254e-07 +2,coarse,1,1.6365805183271576e-08,0.1544470929589978,True,-1.426786184310913e-06,-3.0919909477233887e-07,-3.0919909477233887e-07,-6.286637876939949e-15,-8.326672684688674e-17,-8.326672684688674e-17,-1.4267861780242752e-06,-3.0919909468907214e-07,-3.0919909468907214e-07 +3,fine,1,8.23703105723439e-08,0.31152334896616624,True,4.902016371488571e-06,1.5227124094963074e-07,1.280568540096283e-07,-1.1922754450388595e-14,9.540979117872439e-17,3.452099717193846e-16,4.902016383411326e-06,1.5227124085422095e-07,1.2805685366441832e-07 +3,fine,2,1.0607572520360264e-07,0.3828123813437159,True,8.435919880867004e-06,7.35744833946228e-08,-3.259629011154175e-08,-1.7525911277793682e-14,9.540979117872439e-17,3.5561831257524545e-16,8.435919898392916e-06,7.357448329921301e-08,-3.259629046716006e-08 +3,coarse,1,1.0010523732173482e-07,0.2854567053212911,True,9.115785360336304e-06,3.3155083656311035e-07,3.203749656677246e-07,-3.837208328860697e-15,1.5334955527634975e-15,1.2420620087993939e-15,9.115785364173512e-06,3.315508350296148e-07,3.203749644256626e-07 +4,fine,1,9.437402781475868e-08,0.3632811360585352,True,1.0774470865726471e-05,2.8405338525772095e-07,3.0174851417541504e-07,-2.0582494042464816e-14,2.411265631607762e-16,2.7929047963226594e-16,1.0774470886308965e-05,2.840533850165944e-07,3.0174851389612456e-07 +4,fine,2,1.411709008580786e-07,0.4323516759917293,True,1.1160969734191895e-05,2.169981598854065e-07,5.774199962615967e-08,-1.6453852169640015e-14,-5.533767888366015e-16,-4.2847669856627135e-16,1.1160969750645747e-05,2.1699816043878328e-07,5.7742000054636367e-08 +4,coarse,1,1.2150177930436712e-07,0.37139422446265463,True,1.3064593076705933e-05,5.997717380523682e-07,5.62518835067749e-07,-1.2559397966072083e-14,-5.967448757360216e-16,-2.498001805406602e-16,1.306459308926533e-05,5.99771738649113e-07,5.625188353175492e-07 +5,fine,1,1.2376571800754022e-07,0.4335945297787668,True,1.0852236300706863e-05,-3.022141754627228e-07,-3.1618401408195496e-07,-1.5610776560315287e-14,5.377642775528102e-17,-3.625572064791527e-16,1.085223631631764e-05,-3.022141755164992e-07,-3.1618401371939775e-07 +5,fine,2,1.2417755734794866e-07,0.3644862055932074,True,8.977483958005905e-06,-2.621673047542572e-07,-7.031485438346863e-08,-1.519617764955683e-14,-1.8041124150158794e-16,8.430756093247282e-16,8.977483973202083e-06,-2.6216730457384596e-07,-7.031485522654424e-08 +5,coarse,1,1.2532259030528792e-07,0.38942307019337585,True,1.49458646774292e-05,9.723007678985596e-07,1.2628734111785889e-06,-1.6535384173010925e-14,1.5959455978986625e-16,6.175615574477433e-16,1.4945864693964583e-05,9.72300767738965e-07,1.2628734105610273e-06 +6,fine,1,9.483337493065847e-08,0.32226540864225656,True,6.834045052528381e-06,4.284083843231201e-08,-1.0244548320770264e-07,-1.4689638394571602e-14,1.1102230246251565e-16,2.914335439641036e-16,6.83404506721802e-06,4.284083832128971e-08,-1.0244548349913618e-07 +6,fine,2,1.1486422213380365e-07,0.36328113343919116,True,6.2193721532821655e-06,-4.190951585769653e-08,-1.30385160446167e-08,-1.437044927499187e-14,1.7694179454963432e-16,-1.0408340855860843e-17,6.219372167652615e-06,-4.190951603463833e-08,-1.3038516034208358e-08 +6,coarse,1,1.0239773140519048e-07,0.43028837580529966,True,1.383945345878601e-05,4.954636096954346e-07,4.284083843231201e-07,-2.0011770018868447e-14,3.191891195797325e-16,1.0269562977782698e-15,1.383945347879778e-05,4.954636093762455e-07,4.284083832961638e-07 +7,fine,1,1.1381071352012384e-07,0.39830750519457453,True,5.2102841436862946e-06,-2.0023435354232788e-08,-1.0477378964424133e-07,-1.6167622796103842e-14,9.020562075079397e-17,0.0,5.210284159853917e-06,-2.002343544443841e-08,-1.0477378964424133e-07 +7,fine,2,1.1557639800763297e-07,0.4252975630997776,True,4.476867616176605e-06,-1.2479722499847412e-07,4.0046870708465576e-08,-1.4878723253453074e-14,8.673617379884035e-18,4.388850394221322e-16,4.4768676310553285e-06,-1.2479722500714774e-07,4.004687026958054e-08 +7,coarse,1,1.0902046165828239e-07,0.38161058826685446,True,1.321360468864441e-05,9.126961231231689e-07,-2.086162567138672e-07,-2.4445723223465166e-14,-5.898059818321144e-16,-3.122502256758253e-16,1.3213604713090132e-05,9.126961237129749e-07,-2.0861625640161696e-07 +8,fine,1,1.2369974378145798e-07,0.3659033398608433,True,4.209578037261963e-06,-1.2479722499847412e-07,-2.421438694000244e-08,-1.5269036035547856e-14,-1.4224732503009818e-16,-7.28583859910259e-17,4.209578052530999e-06,-1.247972248562268e-07,-2.4214386867144055e-08 +8,fine,2,1.3039186863572638e-07,0.3566417233064843,True,4.0014274418354034e-06,5.075708031654358e-08,-1.6298145055770874e-08,-1.6002824065886045e-14,-2.949029909160572e-17,-2.5153490401663703e-16,4.0014274578382275e-06,5.075708034603388e-08,-1.629814480423597e-08 +8,coarse,1,1.265961931951054e-07,0.38341345468786764,True,9.08784568309784e-06,6.09084963798523e-07,-5.979090929031372e-07,-2.2336299476677368e-14,-1.4224732503009818e-15,2.0816681711721685e-17,9.087845705434139e-06,6.090849652209962e-07,-5.979090929239539e-07 +9,fine,1,1.1700286717264419e-07,0.42325024900493485,True,2.2551976144313812e-06,-1.150183379650116e-07,-3.026798367500305e-08,-1.5406079190150024e-14,6.418476861114186e-17,2.6194324487249787e-16,2.2551976298374604e-06,-1.1501833802919637e-07,-3.0267983936946297e-08 +9,fine,2,1.05960657470483e-07,0.3591277749177671,True,3.159046173095703e-06,-5.8673322200775146e-08,-1.471489667892456e-07,-1.5987211554602254e-14,-6.245004513516506e-17,-2.0816681711721685e-17,3.1590461890829147e-06,-5.86733221383251e-08,-1.4714896676842892e-07 +9,coarse,1,1.1063907701114317e-07,0.4156431955412631,True,5.3513795137405396e-06,-3.1478703022003174e-07,-5.345791578292847e-07,-2.5042468099201187e-14,1.0408340855860843e-16,-2.2898349882893854e-16,5.351379538783008e-06,-3.1478703032411515e-07,-5.345791576003012e-07 +10,fine,1,1.6477090769573266e-07,0.3991506368171169,True,2.605374902486801e-06,1.2619420886039734e-07,6.007030606269836e-08,-1.5024440025435126e-14,-3.2786273695961654e-16,-2.8622937353617317e-16,2.605374917511241e-06,1.2619420918826008e-07,6.007030634892774e-08 +10,fine,2,1.233670676725751e-07,0.3467327260376902,True,2.4153850972652435e-06,-1.5133991837501526e-07,-1.19674950838089e-07,-1.5607307113363333e-14,-1.9949319973733282e-16,4.631711680858075e-16,2.4153851128725506e-06,-1.5133991817552206e-07,-1.1967495130126016e-07 +10,coarse,1,1.3984166169489498e-07,0.4038458162128909,True,6.22868537902832e-06,-2.942979335784912e-07,3.725290298461914e-09,-2.3592239273284576e-14,-4.163336342344337e-16,1.1657341758564144e-15,6.22868540262056e-06,-2.942979331621576e-07,3.725289132727738e-09 +11,fine,1,1.1264907540109448e-07,0.37435057774799535,True,1.6032718122005463e-06,4.190951585769653e-09,2.9336661100387573e-08,-1.5607307113363333e-14,2.723515857283587e-16,-1.0234868508263162e-16,1.6032718278078534e-06,4.190951313418068e-09,2.9336661202736258e-08 +11,fine,2,1.3385929209519531e-07,0.4296446436631812,True,1.1781230568885803e-06,2.3469328880310059e-07,1.126900315284729e-07,-1.665854953980528e-14,2.0296264668928643e-16,3.2959746043559335e-17,1.1781230735471299e-06,2.3469328860013794e-07,1.1269003149551315e-07 +11,coarse,1,1.2484760447684096e-07,0.3737977990108256,True,1.9688159227371216e-06,-6.146728992462158e-08,-2.421438694000244e-08,-2.295386103412511e-14,-1.5265566588595902e-16,-9.575673587391975e-16,1.9688159456909826e-06,-6.146728977196592e-08,-2.4214385982435083e-08 +12,fine,1,1.1342225503252479e-07,0.3929712248585018,True,2.9103830456733704e-06,1.1827796697616577e-07,1.6670674085617065e-07,-1.6981208106336965e-14,2.5153490401663703e-16,1.0234868508263162e-16,2.9103830626545785e-06,1.1827796672463087e-07,1.6670674075382197e-07 +12,fine,2,1.2337913590787508e-07,0.3632480304781915,True,2.22865492105484e-06,7.450580596923828e-09,1.3690441846847534e-07,-1.7019372022808454e-14,-1.9081958235744878e-17,1.6479873021779667e-16,2.228654938074212e-06,7.450580616005786e-09,1.369044183036766e-07 +12,coarse,1,1.0392955884785948e-07,0.34435036745116887,True,4.416331648826599e-06,8.009374141693115e-08,-7.264316082000732e-08,-2.665923037881157e-14,1.942890293094024e-16,3.3306690738754696e-16,4.4163316754858295e-06,8.009374122264212e-08,-7.264316115307423e-08 +13,fine,1,1.120637568297056e-07,0.3794727716066827,True,1.1702068150043488e-06,-1.4016404747962952e-07,-1.0477378964424133e-07,-1.6571813366006438e-14,8.153200337090993e-17,-1.0928757898653885e-16,1.1702068315761621e-06,-1.4016404756116152e-07,-1.0477378953495375e-07 +13,fine,2,1.1608141914365433e-07,0.3684207409368108,True,1.93621963262558e-06,-2.1979212760925293e-07,-7.543712854385376e-08,-1.696733031852915e-14,1.5612511283791264e-17,4.0072112295064244e-16,1.93621964959291e-06,-2.1979212762486544e-07,-7.543712894457488e-08 +13,coarse,1,1.1553440504297185e-07,0.413461159221051,True,2.12155282497406e-06,9.872019290924072e-08,3.1851232051849365e-07,-2.4966140266258208e-14,1.0685896612017132e-15,3.885780586188048e-16,2.1215528499402003e-06,9.872019184065106e-08,3.185123201299156e-07 +14,fine,1,1.3012184874039434e-07,0.4470057319678252,True,2.093147486448288e-06,-2.7474015951156616e-08,1.816079020500183e-08,-1.6941309466389498e-14,2.0469737016526324e-16,-2.393918396847994e-16,2.0931475033895974e-06,-2.7474016155853986e-08,1.816079044439367e-08 +14,fine,2,1.161938236737825e-07,0.43455223301865037,True,2.180226147174835e-06,1.6577541828155518e-07,3.166496753692627e-08,-1.662038562333379e-14,-3.139849491518021e-16,-5.724587470723463e-17,2.180226163795221e-06,1.6577541859554012e-07,3.1664967594172144e-08 +14,coarse,1,1.171716388359556e-07,0.34014613609932465,True,3.285706043243408e-06,5.21540641784668e-08,-8.940696716308594e-08,-2.5222879340702775e-14,2.0122792321330962e-16,-3.95516952522712e-16,3.2857060684662875e-06,5.2154063977238874e-08,-8.940696676756898e-08 +15,fine,1,1.188765739179587e-07,0.3778719310571328,True,2.386048436164856e-06,1.0989606380462646e-07,4.190951585769653e-08,-1.6297727056802103e-14,3.0010716134398763e-16,5.0306980803327406e-17,2.386048452462583e-06,1.098960635045193e-07,4.190951580738955e-08 +15,fine,2,1.2815464434101642e-07,0.3887039950605819,True,2.2151507437229156e-06,5.3551048040390015e-08,1.5599653124809265e-07,-1.6632528687665626e-14,-3.469446951953614e-17,-2.220446049250313e-16,2.2151507603554443e-06,5.3551048075084484e-08,1.5599653147013726e-07 +15,coarse,1,1.132467172260121e-07,0.3798076391349909,True,4.431232810020447e-06,-6.891787052154541e-08,-4.6566128730773926e-08,-2.4917568008930857e-14,5.898059818321144e-16,7.008282842946301e-16,4.431232834938015e-06,-6.891787111135139e-08,-4.656612943160221e-08 +16,fine,1,1.1449205894464853e-07,0.4232816528057199,True,1.267995685338974e-06,7.962808012962341e-08,8.89413058757782e-08,-1.7224069392973718e-14,1.9255430583342559e-16,2.3071822230491534e-16,1.2679957025630434e-06,7.962807993706911e-08,8.894130564505998e-08 +16,fine,2,1.1465035798519096e-07,0.38660659294745114,True,1.61072239279747e-06,2.0070001482963562e-07,8.242204785346985e-08,-1.688579831515824e-14,2.0816681711721685e-16,-3.95516952522712e-16,1.6107224096832684e-06,2.007000146214688e-07,8.24220482489868e-08 +16,coarse,1,1.026492656430733e-07,0.39551928594354874,True,4.755333065986633e-06,2.8870999813079834e-07,-1.30385160446167e-08,-2.5340840537069198e-14,8.465450562766819e-16,-1.4988010832439613e-15,4.755333091327474e-06,2.887099972842533e-07,-1.3038514545815616e-08 +17,fine,1,1.4306400941688224e-07,0.3804206132029011,True,2.477318048477173e-06,2.952292561531067e-07,2.1420419216156006e-07,-1.6018436577169837e-14,1.1102230246251565e-16,-2.498001805406602e-16,2.4773180644956094e-06,2.952292560420844e-07,2.1420419241136024e-07 +17,fine,2,1.206053866775747e-07,0.40931703720753354,True,2.6957131922245026e-06,3.655441105365753e-07,1.7834827303886414e-07,-1.704365815147213e-14,3.382710778154774e-16,-1.43982048506075e-16,2.6957132092681607e-06,3.6554411019830424e-07,1.7834827318284618e-07 +17,coarse,1,1.3320810943184824e-07,0.4098554436464823,True,4.893168807029724e-06,2.3655593395233154e-07,3.632158041000366e-07,-2.93723378952393e-14,-4.649058915617843e-16,4.2327252813834093e-16,4.893168836402062e-06,2.3655593441723743e-07,3.632158036767641e-07 +18,fine,1,1.1518374609664761e-07,0.37525164303996766,True,3.0049122869968414e-06,2.92900949716568e-07,2.4633482098579407e-07,-1.704365815147213e-14,-1.474514954580286e-16,5.724587470723463e-17,3.0049123040404996e-06,2.929009498640195e-07,2.463348209285482e-07 +18,fine,2,1.5383020013359783e-07,0.4339170567027524,True,2.28220596909523e-06,3.2549723982810974e-07,2.48197466135025e-07,-1.700029006457271e-14,-1.214306433183765e-16,-3.122502256758253e-16,2.28220598609552e-06,3.254972399495404e-07,2.4819746644727525e-07 +18,coarse,1,1.4574858631100085e-07,0.42004802685791165,True,4.898756742477417e-06,-1.564621925354004e-07,-2.123415470123291e-07,-2.679106936298581e-14,1.457167719820518e-16,-4.85722573273506e-17,4.898756769268486e-06,-1.5646219268111716e-07,-2.1234154696375684e-07 +19,fine,1,1.1289196333308382e-07,0.4426868958150174,True,2.4051405489444733e-06,3.8230791687965393e-07,4.23286110162735e-07,-1.7246620798161416e-14,-5.447031714567174e-16,-2.42861286636753e-16,2.405140566191094e-06,3.823079174243571e-07,4.2328611040559627e-07 +19,fine,2,1.3318459290978524e-07,0.4458767766498759,True,2.4051405489444733e-06,-1.3504177331924438e-08,-1.6298145055770874e-08,-1.6679366221517e-14,-1.8561541192951836e-16,4.683753385137379e-17,2.4051405656238395e-06,-1.3504177146309027e-08,-1.6298145102608408e-08 +19,coarse,1,1.3627775263813646e-07,0.37598585924709055,True,6.38328492641449e-06,-2.514570951461792e-07,2.1792948246002197e-07,-2.724209746673978e-14,-7.91033905045424e-16,-1.3877787807814457e-17,6.383284953656587e-06,-2.514570943551453e-07,2.1792948247389976e-07 +20,fine,1,1.2067538701643343e-07,0.397654453667931,True,3.3676624298095703e-06,-7.636845111846924e-08,8.195638656616211e-08,-1.6471199404399783e-14,1.0581813203458523e-16,7.806255641895632e-17,3.3676624462807697e-06,-7.636845122428737e-08,8.195638648809955e-08 +20,fine,2,1.1349498318935503e-07,0.4276325956343959,True,3.5767443478107452e-06,-7.869675755500793e-08,6.565824151039124e-08,-1.5959455978986625e-14,9.020562075079397e-17,5.898059818321144e-17,3.5767443637702012e-06,-7.869675764521356e-08,6.565824145141064e-08 +20,coarse,1,1.5850306378517587e-07,0.5285112236646456,True,3.5408884286880493e-06,-1.993030309677124e-07,-3.7066638469696045e-07,-2.525757381022231e-14,7.91033905045424e-16,-2.3592239273284576e-16,3.540888453945623e-06,-1.993030317587463e-07,-3.7066638446103806e-07 +21,fine,1,1.2747028055315468e-07,0.3807671146447972,True,3.180466592311859e-06,-9.872019290924072e-08,-4.377216100692749e-08,-1.619537837171947e-14,5.204170427930421e-17,-1.4224732503009818e-16,3.1804666085072375e-06,-9.872019296128243e-08,-4.3772160864680165e-08 +21,fine,2,1.1436689684174439e-07,0.41457208617159613,True,2.8158538043498993e-06,-4.516914486885071e-08,3.119930624961853e-08,-1.622833811776303e-14,-2.0296264668928643e-16,-1.7867651802561113e-16,2.8158538205782374e-06,-4.516914466588806e-08,3.119930642829505e-08 +21,coarse,1,1.3219836714206679e-07,0.4111722561110483,True,5.48921525478363e-06,-9.816139936447144e-07,-5.345791578292847e-07,-2.7602919949742954e-14,4.0245584642661925e-16,2.7755575615628914e-16,5.48921528238655e-06,-9.816139940471702e-07,-5.345791581068404e-07 +22,fine,1,1.247986221031283e-07,0.4025936491208882,True,2.5955960154533386e-06,-1.1734664440155029e-07,7.636845111846924e-08,-1.670712179713263e-14,2.0643209364124004e-16,-1.196959198423997e-16,2.5955960321604604e-06,-1.1734664460798239e-07,7.636845123816516e-08 +22,fine,2,1.2467687349193568e-07,0.4026463456064581,True,2.169981598854065e-06,-2.0023435354232788e-07,-2.5331974029541016e-07,-1.5954251808558695e-14,4.336808689942018e-17,8.847089727481716e-17,2.1699816148083167e-06,-2.0023435358569597e-07,-2.5331974038388105e-07 +22,coarse,1,1.303169513411362e-07,0.4534581358023719,True,4.8317015171051025e-06,-1.4826655387878418e-06,-8.456408977508545e-07,-2.6728619317850644e-14,-9.71445146547012e-17,-4.163336342344337e-16,4.831701543833722e-06,-1.4826655386906973e-06,-8.456408973345209e-07 +23,fine,1,1.1580148451262318e-07,0.3892248238329876,True,2.83215194940567e-06,-4.284083843231201e-08,-1.3317912817001343e-07,-1.7317744460676465e-14,2.2551405187698492e-17,-3.9898639947466563e-17,2.8321519667234146e-06,-4.284083845486342e-08,-1.331791281301148e-07 +23,fine,2,1.4772394407724931e-07,0.44883956143532583,True,2.432148903608322e-06,-1.0570511221885681e-07,-3.306195139884949e-08,-1.628211454551831e-14,4.85722573273506e-17,1.1796119636642288e-16,2.4321489198904367e-06,-1.0570511226742907e-07,-3.3061951516810684e-08 +23,coarse,1,1.4415727089822639e-07,0.46236304392819116,True,8.864328265190125e-06,-8.624047040939331e-07,-5.19677996635437e-07,-2.839395385478838e-14,-3.7470027081099033e-16,-1.0269562977782698e-15,8.864328293584078e-06,-8.624047037192328e-07,-5.196779956084807e-07 +24,fine,1,1.1816075007331506e-07,0.40334771123509106,True,2.196524292230606e-06,-5.2619725465774536e-08,-1.327134668827057e-07,-1.619537837171947e-14,3.400058012914542e-16,7.979727989493313e-17,2.1965243084259845e-06,-5.261972580578034e-08,-1.3271346696250297e-07 +24,fine,2,1.2605529897680157e-07,0.4651221485857391,True,2.941582351922989e-06,-2.2584572434425354e-07,6.05359673500061e-09,-1.802204219192305e-14,-2.5153490401663703e-16,2.3418766925686896e-16,2.941582369945031e-06,-2.2584572409271864e-07,6.053596500812941e-09 +24,coarse,1,1.573361411155716e-07,0.43294013951653565,True,9.939074516296387e-06,-2.905726432800293e-07,1.4156103134155273e-07,-2.768618667658984e-14,-1.6653345369377348e-16,1.1102230246251565e-15,9.939074543982573e-06,-2.9057264311349584e-07,1.415610302313297e-07 diff --git a/research/fine_surface_joint_20261014/suction_ledger.csv b/research/fine_surface_joint_20261014/suction_ledger.csv new file mode 100644 index 0000000..92cf1f4 --- /dev/null +++ b/research/fine_surface_joint_20261014/suction_ledger.csv @@ -0,0 +1,25 @@ +step,time,average_bound_ratio,leaf_m,leaf_px,leaf_py,delta_m,delta_px,delta_py,boundary_m,boundary_px,boundary_py,fine_transfer_m,fine_transfer_px,fine_transfer_py,coarse_transfer_m,coarse_transfer_px,coarse_transfer_py,raw_m,raw_px,raw_py,collision_drift_m,collision_drift_px,collision_drift_py,average_rounding_m,average_rounding_px,average_rounding_py,closure_m,closure_px,closure_py,cumulative_raw_m,cumulative_raw_px,cumulative_raw_py,cumulative_closure_m,cumulative_closure_px,cumulative_closure_py +1,1,0.28124994289828603,560.7465738453902,-0.0016551441513001919,-0.001416988205164671,-0.003430332522839308,-0.0016551441513001919,-0.001416988205164671,-0.0034449007362127304,-0.0016550971195101738,-0.001416652463376522,-3.557652235031128e-07,0.0,0.0,5.308538675308228e-07,-1.862645149230957e-09,-1.7695128917694092e-07,1.4393124729394913e-05,-4.516914486885071e-08,-1.587904989719391e-07,1.4393124729394913e-05,-4.516914486885071e-08,-1.587904989719391e-07,1.7508864402770996e-07,-1.862645149230957e-09,-1.7695128917694092e-07,0.0,0.0,0.0,1.4393124729394913e-05,-4.516914486885071e-08,-1.587904989719391e-07,0.0,0.0,0.0 +2,2,0.37499987985940486,560.7428558217362,-0.003098900429904461,-0.0026293257251381874,-0.003718023654073477,-0.001443756278604269,-0.0012123375199735165,-0.0037200921215116978,-0.0014432151801884174,-0.001211958471685648,-2.193264663219452e-06,-4.6566128730773926e-09,-1.685693860054016e-07,2.032145857810974e-06,-1.5087425708770752e-07,1.695007085800171e-07,2.2295862436294556e-06,-3.855675458908081e-07,-3.7997961044311523e-07,2.2295862436294556e-06,-3.855675458908081e-07,-3.7997961044311523e-07,-1.6111880540847778e-07,-1.555308699607849e-07,9.313225746154785e-10,0.0,0.0,0.0,1.6622710973024368e-05,-4.307366907596588e-07,-5.387701094150543e-07,0.0,0.0,0.0 +3,3,0.2812499146093721,560.739008476492,-0.004490140359848738,-0.0038015726022422314,-0.003847345244139433,-0.0013912399299442768,-0.001172246877104044,-0.0038698003627359867,-0.0013918033801019192,-0.001172670628875494,-3.6400742828845978e-06,4.698522388935089e-07,4.6798959374427795e-07,3.641471266746521e-06,-4.637986421585083e-07,-4.600733518600464e-07,2.245372161269188e-05,5.573965609073639e-07,4.1583552956581116e-07,2.245372161269188e-05,5.573965609073639e-07,4.1583552956581116e-07,1.3969838619232178e-09,6.05359673500061e-09,7.916241884231567e-09,0.0,0.0,0.0,3.907643258571625e-05,1.2665987014770508e-07,-1.2293457984924316e-07,0.0,0.0,0.0 +4,4,0.37499987985940486,560.7351214168593,-0.005752546712756157,-0.004868627525866032,-0.0038870596326887608,-0.0012624063529074192,-0.0010670549236238003,-0.003921949304640293,-0.0012635616585612297,-0.001068035140633583,-6.910879164934158e-06,3.1711533665657043e-07,3.9534643292427063e-07,6.800517439842224e-06,-2.6263296604156494e-07,-3.371387720108032e-07,3.50000336766243e-05,1.1008232831954956e-06,9.220093488693237e-07,3.50000336766243e-05,1.1008232831954956e-06,9.220093488693237e-07,-1.103617250919342e-07,5.448237061500549e-08,5.820766091346741e-08,0.0,0.0,0.0,7.407646626234055e-05,1.2274831533432007e-06,7.990747690200806e-07,0.0,0.0,0.0 +5,5,0.3749998295680158,560.7312193890102,-0.006873782258480787,-0.0058157010935246944,-0.0039020278491079807,-0.0011212355457246304,-0.0009470735676586628,-0.003936932887881994,-0.001121701207011938,-0.0009480114094913006,-7.287599146366119e-06,1.0672956705093384e-06,4.637986421585083e-07,7.417052984237671e-06,-1.0095536708831787e-06,-4.023313522338867e-07,3.477558493614197e-05,4.079192876815796e-07,8.763745427131653e-07,3.477558493614197e-05,4.079192876815796e-07,8.763745427131653e-07,1.2945383787155151e-07,5.774199962615967e-08,6.146728992462158e-08,0.0,0.0,0.0,0.00010885205119848251,1.6354024410247803e-06,1.6754493117332458e-06,0.0,0.0,0.0 +6,6,0.46874973195382685,560.7273077829741,-0.007863933686167002,-0.0066518173553049564,-0.003911606036126614,-0.0009901514276862144,-0.000836116261780262,-0.003938451875001192,-0.0009906026534736156,-0.0008363532833755016,-4.966277629137039e-06,1.1599622666835785e-06,1.234002411365509e-07,4.9192458391189575e-06,-1.2051314115524292e-06,-1.993030309677124e-07,2.6892870664596558e-05,4.9639493227005e-07,3.129243850708008e-07,2.6892870664596558e-05,4.9639493227005e-07,3.129243850708008e-07,-4.7031790018081665e-08,-4.516914486885071e-08,-7.59027898311615e-08,0.0,0.0,0.0,0.00013574492186307907,2.1317973732948303e-06,1.9883736968040466e-06,0.0,0.0,0.0 +7,7,0.4687521208060999,560.7233943245374,-0.008734654169529676,-0.0073870024643838406,-0.003913458436727524,-0.0008707204833626747,-0.0007351851090788841,-0.003936384338885546,-0.0008714343421161175,-0.0007349248044192791,1.7766840755939484e-05,1.440197229385376e-05,7.420778274536133e-06,-1.7741695046424866e-05,-1.4455989003181458e-05,-7.407739758491516e-06,2.290075644850731e-05,7.67875462770462e-07,-2.7334317564964294e-07,2.290075644850731e-05,7.67875462770462e-07,-2.7334317564964294e-07,2.514570951461792e-08,-5.4016709327697754e-08,1.30385160446167e-08,0.0,0.0,0.0,0.00015864567831158638,2.8996728360652924e-06,1.7150305211544037e-06,0.0,0.0,0.0 +8,8,0.4687808518052075,560.7194780893624,-0.009498408995568752,-0.008031456731259823,-0.00391623517498374,-0.0007637548260390759,-0.0006444542668759823,-0.003933582454919815,-0.0007642609998583794,-0.0006437832489609718,0.00016007013618946075,8.850079029798508e-05,5.473848432302475e-05,-0.00016002170741558075,-8.852966129779816e-05,-5.477108061313629e-05,1.7298851162195206e-05,5.350448191165924e-07,-6.384216248989105e-07,1.7298851162195206e-05,5.350448191165924e-07,-6.384216248989105e-07,4.842877388000488e-08,-2.8870999813079834e-08,-3.259629011154175e-08,0.0,0.0,0.0,0.00017594452947378159,3.4347176551818848e-06,1.0766088962554932e-06,0.0,0.0,0.0 +9,9,0.46888398548910104,560.7155580227263,-0.010167959611862898,-0.008595113176852465,-0.003920066636055708,-0.0006695506162941456,-0.0005636564455926418,-0.003930842503905296,-0.0006690975278615952,-0.0005629975348711014,0.0006066383793950081,0.0002762451767921448,0.00018928851932287216,-0.0006066281348466873,-0.0002762097865343094,-0.00018923543393611908,1.0765623301267624e-05,-4.884786903858185e-07,-7.119961082935333e-07,1.0765623301267624e-05,-4.884786903858185e-07,-7.119961082935333e-07,1.0244548320770264e-08,3.5390257835388184e-08,5.3085386753082275e-08,0.0,0.0,0.0,0.0001867101527750492,2.9462389647960663e-06,3.6461278796195984e-07,0.0,0.0,0.0 +10,10,0.46903176896324594,560.7116407523863,-0.01075396640226245,-0.009087595622986555,-0.003917270340025425,-0.0005860067903995514,-0.0004924824461340904,-0.0039285351522266865,-0.0005857185460627079,-0.0004924158565700054,0.001471752766519785,0.0005768421106040478,0.0004282691515982151,-0.0014717373996973038,-0.0005768109112977982,-0.0004282798618078232,1.1249445378780365e-05,-3.1944364309310913e-07,-5.587935447692871e-08,1.1249445378780365e-05,-3.1944364309310913e-07,-5.587935447692871e-08,1.5366822481155396e-08,3.119930624961853e-08,-1.0710209608078003e-08,0.0,0.0,0.0,0.00019795959815382957,2.626795321702957e-06,3.0873343348503113e-07,0.0,0.0,0.0 +11,11,0.4691126134417028,560.7077189418487,-0.011267102789133787,-0.009519137907773256,-0.003921810537576675,-0.0005131363868713379,-0.0004315422847867012,-0.003926586825400591,-0.0005133007653057575,-0.0004316861741244793,0.0026394762098789215,0.0009217467159032822,0.0007308274507522583,-0.0026394501328468323,-0.0009217597544193268,-0.0007308013737201691,4.750210791826248e-06,1.7741695046424866e-07,1.1781230568885803e-07,4.750210791826248e-06,1.7741695046424866e-07,1.1781230568885803e-07,2.60770320892334e-08,-1.30385160446167e-08,2.60770320892334e-08,0.0,0.0,0.0,0.00020270980894565582,2.804212272167206e-06,4.2654573917388916e-07,0.0,0.0,0.0 +12,12,0.46901560970475215,560.7038032673299,-0.011718058958649635,-0.009898302145302296,-0.003915674518793821,-0.00045095616951584816,-0.0003791642375290394,-0.0039251805283129215,-0.00045116664841771126,-0.00037938589230179787,0.003811669535934925,0.0012245913967490196,0.0010236278176307678,-0.0038117188960313797,-0.0012245867401361465,-0.001023637130856514,9.55536961555481e-06,2.0582228899002075e-07,2.3096799850463867e-07,9.55536961555481e-06,2.0582228899002075e-07,2.3096799850463867e-07,-4.936009645462036e-08,4.6566128730773926e-09,-9.313225746154785e-09,0.0,0.0,0.0,0.00021226517856121063,3.0100345611572266e-06,6.575137376785278e-07,0.0,0.0,0.0 +13,13,0.46940153309401067,560.6998843806796,-0.012116494122892618,-0.010233358014374971,-0.00391888665035367,-0.00039843516424298286,-0.0003350558690726757,-0.003924091346561909,-0.00039816368371248245,-0.00033517926931381226,0.004714041016995907,0.0014252373948693275,0.0012384280562400818,-0.004714064300060272,-0.0014252476394176483,-0.0012384429574012756,5.227979272603989e-06,-2.612359821796417e-07,1.3830140233039856e-07,5.227979272603989e-06,-2.612359821796417e-07,1.3830140233039856e-07,-2.3283064365386963e-08,-1.0244548320770264e-08,-1.4901161193847656e-08,0.0,0.0,0.0,0.00021749315783381462,2.748798578977585e-06,7.958151400089264e-07,0.0,0.0,0.0 +14,14,0.37547977019595935,560.695968686603,-0.012470003217458725,-0.010531187988817692,-0.003915694076567888,-0.0003535090945661068,-0.0002978299744427204,-0.00392324011772871,-0.0003537451848387718,-0.00029775500297546387,0.005242751911282539,0.0015017995610833168,0.0013365093618631363,-0.005242764949798584,-0.0015017539262771606,-0.0013365447521209717,7.559079676866531e-06,1.9045546650886536e-07,-3.958120942115784e-08,7.559079676866531e-06,1.9045546650886536e-07,-3.958120942115784e-08,-1.30385160446167e-08,4.563480615615845e-08,-3.5390257835388184e-08,0.0,0.0,0.0,0.00022505223751068115,2.93925404548645e-06,7.562339305877686e-07,0.0,0.0,0.0 +15,15,0.46931915536962354,560.6920553292148,-0.012786881532520056,-0.010797811206430197,-0.003913357388228178,-0.0003168783150613308,-0.00026662321761250496,-0.003922352101653814,-0.00031696120277047157,-0.0002668178640305996,0.005457909312099218,0.0014622039161622524,0.0013122227974236012,-0.00545794703066349,-0.0014622155576944351,-0.0013121794909238815,9.032431989908218e-06,9.452924132347107e-08,1.5133991837501526e-07,9.032431989908218e-06,9.452924132347107e-08,1.5133991837501526e-07,-3.771856427192688e-08,-1.1641532182693481e-08,4.330649971961975e-08,0.0,0.0,0.0,0.00023408466950058937,3.0337832868099213e-06,9.075738489627838e-07,0.0,0.0,0.0 +16,16,0.4688354158197654,560.6881414898671,-0.013073210138827562,-0.011039237957447767,-0.0039138393476605415,-0.00028632860630750656,-0.0002414267510175705,-0.00392143102362752,-0.00028690462931990623,-0.0002415659837424755,0.005488332826644182,0.0013348772190511227,0.0011904998682439327,-0.005488375201821327,-0.001334870234131813,-0.0011905189603567123,7.634051144123077e-06,5.690380930900574e-07,1.5832483768463135e-07,7.634051144123077e-06,5.690380930900574e-07,1.5832483768463135e-07,-4.237517714500427e-08,6.984919309616089e-09,-1.909211277961731e-08,0.0,0.0,0.0,0.00024171872064471245,3.6028213798999786e-06,1.0658986866474152e-06,0.0,0.0,0.0 +17,17,0.4688642199257324,560.6842309772037,-0.013335466850548983,-0.011260137427598238,-0.003910512663424015,-0.0002622567117214203,-0.00022089947015047073,-0.003920585848391056,-0.0002631489187479019,-0.0002216007560491562,0.005444665905088186,0.001153834629803896,0.0010090763680636883,-0.005444658920168877,-0.0011538397520780563,-0.0010091308504343033,1.00662000477314e-05,8.973293006420135e-07,7.557682693004608e-07,1.00662000477314e-05,8.973293006420135e-07,7.557682693004608e-07,6.984919309616089e-09,-5.122274160385132e-09,-5.448237061500549e-08,0.0,0.0,0.0,0.00025178492069244385,4.500150680541992e-06,1.821666955947876e-06,0.0,0.0,0.0 +18,18,0.46904972325243455,560.6803212598898,-0.013579126913100481,-0.01146557042375207,-0.003909717313945293,-0.0002436600625514984,-0.00020543299615383148,-0.003919912502169609,-0.0002440977841615677,-0.00020573288202285767,0.005378367379307747,0.0009484421461820602,0.0008058762177824974,-0.005378358066082001,-0.0009484663605690002,-0.0008058585226535797,1.0185874998569489e-05,4.6193599700927734e-07,2.8219074010849e-07,1.0185874998569489e-05,4.6193599700927734e-07,2.8219074010849e-07,9.313225746154785e-09,-2.421438694000244e-08,1.7695128917694092e-08,0.0,0.0,0.0,0.00026197079569101334,4.9620866775512695e-06,2.103857696056366e-06,0.0,0.0,0.0 +19,19,0.4690241690953882,560.6764128012583,-0.013806662522256374,-0.01165736373513937,-0.003908458631485701,-0.00022753560915589333,-0.0001917933113873005,-0.003919640555977821,-0.00022763200104236603,-0.00019236188381910324,0.005283908452838659,0.0007355022244155407,0.0006050593219697475,-0.005283920094370842,-0.0007355231791734695,-0.0006051156669855118,1.1193566024303436e-05,1.1734664440155029e-07,6.249174475669861e-07,1.1193566024303436e-05,1.1734664440155029e-07,6.249174475669861e-07,-1.1641532182693481e-08,-2.0954757928848267e-08,-5.634501576423645e-08,0.0,0.0,0.0,0.00027316436171531677,5.07943332195282e-06,2.728775143623352e-06,0.0,0.0,0.0 +20,20,0.4691149902535097,560.6725037032738,-0.014019680209457874,-0.01183774508535862,-0.003909097984433174,-0.00021301768720149994,-0.00018038135021924973,-0.003919586073607206,-0.00021268753334879875,-0.00018017226830124855,0.0051221540197730064,0.000519266352057457,0.0004148585721850395,-0.005122151225805283,-0.000519242137670517,-0.0004148446023464203,1.0485295206308365e-05,-3.543682396411896e-07,-2.230517566204071e-07,1.0485295206308365e-05,-3.543682396411896e-07,-2.230517566204071e-07,2.7939677238464355e-09,2.421438694000244e-08,1.3969838619232178e-08,0.0,0.0,0.0,0.00028364965692162514,4.72506508231163e-06,2.505723387002945e-06,0.0,0.0,0.0 +21,21,0.46903467995095127,560.6685956828296,-0.01421999093145132,-0.01200737152248621,-0.003908020444214344,-0.00020031072199344635,-0.00016962643712759018,-0.003919499460607767,-0.0001992243342101574,-0.00016904575750231743,0.0048424312844872475,0.0002950672060251236,0.00023025646805763245,-0.00484243780374527,-0.00029502809047698975,-0.0002302899956703186,1.1485535651445389e-05,-1.1255033314228058e-06,-5.471520125865936e-07,1.1485535651445389e-05,-1.1255033314228058e-06,-5.471520125865936e-07,-6.51925802230835e-09,3.91155481338501e-08,-3.3527612686157227e-08,0.0,0.0,0.0,0.0002951351925730705,3.5995617508888245e-06,1.9585713744163513e-06,0.0,0.0,0.0 +22,22,0.4690269226422474,560.6646860563196,-0.014409893658012152,-0.01216775132343173,-0.003909626509994268,-0.00018990272656083107,-0.0001603798009455204,-0.003919223323464394,-0.00018808525055646896,-0.00015935394912958145,0.004410987254232168,5.6739430874586105e-05,4.135677590966225e-05,-0.0044109877198934555,-5.675666034221649e-05,-4.13600355386734e-05,9.597279131412506e-06,-1.80024653673172e-06,-1.0225921869277954e-06,9.597279131412506e-06,-1.80024653673172e-06,-1.0225921869277954e-06,-4.656612873077393e-10,-1.7229467630386353e-08,-3.259629011154175e-09,0.0,0.0,0.0,0.00030473247170448303,1.7993152141571045e-06,9.359791874885559e-07,0.0,0.0,0.0 +23,23,0.46895167590501197,560.6607814244926,-0.014590884558856487,-0.012320364825427532,-0.0039046318270266056,-0.00018099090084433556,-0.00015261350199580193,-0.003918746951967478,-0.00017994502559304237,-0.00015195319429039955,0.0038275266997516155,-0.00019492162391543388,-0.00015757465735077858,-0.0038275402039289474,0.0001948866993188858,0.0001576002687215805,1.4128629118204117e-05,-1.010950654745102e-06,-6.859190762042999e-07,1.4128629118204117e-05,-1.010950654745102e-06,-6.859190762042999e-07,-1.3504177331924438e-08,-3.4924596548080444e-08,2.561137080192566e-08,0.0,0.0,0.0,0.00031886110082268715,7.883645594120026e-07,2.50060111284256e-07,0.0,0.0,0.0 +24,24,0.46890732263511536,560.6568783186376,-0.014766339212656021,-0.012467360123991966,-0.003903105854988098,-0.00017545465379953384,-0.00014699529856443405,-0.003918208181858063,-0.00017489027231931686,-0.00014702323824167252,0.0031356504186987877,-0.0004478944465517998,-0.00036316923797130585,-0.003135625272989273,0.00044789910316467285,0.00036318227648735046,1.5077181160449982e-05,-5.690380930900574e-07,1.4901161193847656e-08,1.5077181160449982e-05,-5.690380930900574e-07,1.4901161193847656e-08,2.514570951461792e-08,4.6566128730773926e-09,1.30385160446167e-08,0.0,0.0,0.0,0.00033393828198313713,2.193264663219452e-07,2.6496127247810364e-07,0.0,0.0,0.0 diff --git a/research/fine_surface_joint_20261014/suction_propagation.csv b/research/fine_surface_joint_20261014/suction_propagation.csv new file mode 100644 index 0000000..f017bcc --- /dev/null +++ b/research/fine_surface_joint_20261014/suction_propagation.csv @@ -0,0 +1,97 @@ +metric,time,signal,baseline,absolute,any_crossed,peak_crossed,x,y,q +coarse_interface_u,1,0.0,0.0,0.0,False,False,3.5,3.5, +coarse_interface_u,2,0.0,2.63417801721126e-09,2.63417801721126e-09,False,False,3.5,3.5, +coarse_interface_u,3,0.0,2.63417801721126e-09,2.63417801721126e-09,False,False,3.5,3.5, +coarse_interface_u,4,0.0,6.585443742795605e-08,6.585443742795605e-08,False,False,3.5,3.5, +coarse_interface_u,5,0.0,1.2644051067663912e-07,1.2644051067663912e-07,False,False,3.5,3.5, +coarse_interface_u,6,1.9186142054314123e-07,1.4528626697542904e-07,4.660334981743319e-08,False,False,20.5,12.5, +coarse_interface_u,7,4.091979903802207e-06,2.0116559817931723e-07,3.8910894220610345e-06,True,True,20.5,13.5, +coarse_interface_u,8,2.311182477441854e-05,1.5646213891164667e-07,2.2955448242208372e-05,True,True,20.5,13.5, +coarse_interface_u,9,6.767647549251264e-05,1.5646213891164667e-07,6.752003656156048e-05,True,True,20.5,13.5, +coarse_interface_u,10,0.0001337150378395613,9.750014426779573e-08,0.00013361820089187484,True,True,20.5,13.5, +coarse_interface_u,11,0.00020218710417179174,1.1795114315203827e-07,0.00020207424859213912,True,True,20.5,13.5, +coarse_interface_u,12,0.0002568344215192973,7.455233297611785e-08,0.00025676033381921514,True,True,20.5,14.5, +coarse_interface_u,13,0.00028408902792915417,3.83541997932092e-08,0.00028405737088288245,True,True,20.5,14.5, +coarse_interface_u,14,0.0002878189146376881,3.003423681142711e-08,0.0002878487673732557,True,True,20.5,15.5, +coarse_interface_u,15,0.00027841070597653145,6.516592454722021e-08,0.0002784504724796873,True,True,20.5,16.5, +coarse_interface_u,16,0.0002652060129478788,1.006517304071618e-07,0.00026516043242156813,True,True,20.5,17.5, +coarse_interface_u,17,0.0002512614305767982,9.86322156278415e-08,0.00025121946497710793,True,True,20.5,18.5, +coarse_interface_u,18,0.00023870047136388868,1.0286787296380317e-07,0.00023871152377663379,True,True,20.5,19.5, +coarse_interface_u,19,0.00022600944747549703,7.783088195871973e-08,0.00022597593519089906,True,True,20.5,20.5, +coarse_interface_u,20,0.00021431184774763036,8.503127640307697e-08,0.00021428571329826077,True,True,20.5,20.5, +coarse_interface_u,21,0.00019575956040664123,7.893743237430962e-08,0.00019568735051647606,True,True,20.5,20.5, +coarse_interface_u,22,0.00017544769865184928,5.2749351285234925e-08,0.00017539495458202247,True,True,20.5,20.5, +coarse_interface_u,23,0.00016267972853265252,8.178685339035058e-08,0.00016263380071292468,True,True,20.5,14.5, +coarse_interface_u,24,0.00015978262119523088,6.715860617082587e-08,0.00015974108955029212,True,True,20.5,14.5, +coarse_bulk_u,1,0.0,0.0,0.0,False,False,0.5,0.5, +coarse_bulk_u,2,0.0,0.0,0.0,False,False,0.5,0.5, +coarse_bulk_u,3,0.0,0.0,0.0,False,False,0.5,0.5, +coarse_bulk_u,4,0.0,0.0,0.0,False,False,0.5,0.5, +coarse_bulk_u,5,0.0,0.0,0.0,False,False,0.5,0.5, +coarse_bulk_u,6,0.0,0.0,0.0,False,False,0.5,0.5, +coarse_bulk_u,7,7.82310665831233e-08,2.12341462371735e-07,1.341103957886117e-07,False,False,21.5,13.5, +coarse_bulk_u,8,1.9454402095498935e-06,2.458690369633922e-07,1.6999616130940679e-06,True,False,21.5,13.5, +coarse_bulk_u,9,1.177304052098705e-05,1.564621179284487e-07,1.1616666785920634e-05,True,True,21.5,13.5, +coarse_bulk_u,10,3.768468268046806e-05,1.0327184058071679e-07,3.758247372213889e-05,True,True,21.5,13.5, +coarse_bulk_u,11,8.249500148168606e-05,4.214683516511236e-08,8.24651319357052e-05,True,True,21.5,13.5, +coarse_bulk_u,12,0.00013911632875122394,5.890198697622995e-09,0.00013911827376976638,True,True,21.5,13.5, +coarse_bulk_u,13,0.0001940498057077554,4.806920811870088e-08,0.00019408186753519264,True,True,21.5,14.5, +coarse_bulk_u,14,0.00023606781230746572,3.215422633434082e-08,0.0002360762872001673,True,True,21.5,14.5, +coarse_bulk_u,15,0.0002548619441637075,3.434546877545681e-08,0.0002548861189892584,True,True,21.5,14.5, +coarse_bulk_u,16,0.00025644070267233306,0.0,0.00025644070267233306,True,True,21.5,15.5, +coarse_bulk_u,17,0.00024779621047094693,6.606481633104396e-08,0.00024773971117601724,True,True,21.5,16.5, +coarse_bulk_u,18,0.00023605776538134437,6.929437569595666e-08,0.00023599681787995022,True,True,21.5,17.5, +coarse_bulk_u,19,0.00022483643371073512,1.0390817551817351e-07,0.00022475474112598463,True,True,21.5,19.5, +coarse_bulk_u,20,0.00021493179783986402,1.042082306083734e-07,0.0002148440172340466,True,True,22.5,18.5, +coarse_bulk_u,21,0.00020607683833491475,9.442706670805767e-08,0.00020599766123702618,True,True,21.5,20.5, +coarse_bulk_u,22,0.0001975946374450119,5.556802130737047e-08,0.0001975402371312418,True,True,22.5,20.5, +coarse_bulk_u,23,0.00018932913257368715,4.4703464263670685e-08,0.00018936187038743642,True,True,22.5,21.5, +coarse_bulk_u,24,0.000179693129058515,9.995996742145265e-08,0.00017978823062286703,True,True,22.5,22.5, +fine_band_neq,1,0.0,3.000928300994632e-09,3.000928300994632e-09,False,False,4.25,4.25, +fine_band_neq,2,0.0,4.501393077727123e-09,4.501393077727123e-09,False,False,4.25,4.25, +fine_band_neq,3,0.0,2.069606169774474e-08,2.069606169774474e-08,False,False,4.25,4.25, +fine_band_neq,4,0.0,4.1392115429639276e-09,4.1392115429639276e-09,False,False,4.25,4.25, +fine_band_neq,5,0.0,4.1392115429639276e-09,4.1392115429639276e-09,False,False,4.25,4.25, +fine_band_neq,6,3.733491271140643e-07,9.934099098884985e-09,3.832832262129493e-07,True,True,19.75,13.25, +fine_band_neq,7,2.0319504568933056e-06,9.934099098884985e-09,2.0418845559921905e-06,True,True,19.75,13.25, +fine_band_neq,8,5.038458095685261e-06,9.934099098884985e-09,5.048392194784146e-06,True,True,19.75,13.75, +fine_band_neq,9,7.299560118911863e-06,1.1589783133203468e-08,7.3111499020450665e-06,True,True,19.75,14.25, +fine_band_neq,10,7.386030289713297e-06,9.106256526614231e-09,7.395136546239911e-06,True,True,19.75,15.25, +fine_band_neq,11,6.856089636353424e-06,5.794905943989903e-09,6.850294730409434e-06,True,True,19.75,17.25, +fine_band_neq,12,6.198413803892855e-06,6.622735776451449e-09,6.201725167243044e-06,True,True,19.75,18.25, +fine_band_neq,13,5.319780258750129e-06,4.139212333997833e-09,5.316468887739401e-06,True,True,19.75,19.25, +fine_band_neq,14,5.283330124894459e-06,4.967056432825245e-09,5.278363068461633e-06,True,True,19.75,19.75, +fine_band_neq,15,3.967651562297725e-06,4.553132745832578e-09,3.964340190287796e-06,True,True,19.75,19.75, +fine_band_neq,16,3.7551803555024854e-06,6.622738135675377e-09,3.74855761736681e-06,True,True,19.75,16.75, +fine_band_neq,17,3.5764174459163023e-06,6.622736969941201e-09,3.5755896076739013e-06,True,True,19.75,17.75, +fine_band_neq,18,3.230913338148067e-06,1.7384672978959514e-08,3.2135286651691075e-06,True,True,19.75,18.75, +fine_band_neq,19,3.160623228692927e-06,9.934106745546067e-09,3.1631067707871274e-06,True,True,19.75,19.75, +fine_band_neq,20,3.2258282446351316e-06,8.278412177986638e-09,3.217549832457145e-06,True,True,19.75,19.75, +fine_band_neq,21,2.8042083782819915e-06,1.1589792486832451e-08,2.8124868040602102e-06,True,True,19.75,19.75, +fine_band_neq,22,2.2509872253939633e-06,1.241763983306221e-09,2.2509872265041864e-06,True,True,19.75,19.75, +fine_band_neq,23,1.7420757160158118e-06,2.0696062086322797e-09,1.7412478748313198e-06,True,True,19.75,19.75, +fine_band_neq,24,1.7765396425617475e-06,7.864502313270627e-09,1.7773674825805053e-06,True,True,4.25,8.25, +transfer_neq,1,0.0,1.5004641487625925e-09,1.5004641487625925e-09,False,False,3.5,3.5,6 +transfer_neq,2,0.0,3.000928290586291e-09,3.000928290586291e-09,False,False,3.5,3.5,6 +transfer_neq,3,0.0,3.000928290586291e-09,3.000928290586291e-09,False,False,3.5,3.5,6 +transfer_neq,4,0.0,6.881438113781613e-09,6.881438113781613e-09,False,False,3.5,3.5,6 +transfer_neq,5,0.0,6.467520081987477e-09,6.467520081987477e-09,False,False,3.5,3.5,6 +transfer_neq,6,4.1392107713589255e-08,1.7384695072397705e-08,5.877680278598696e-08,False,False,20.5,12.5,1 +transfer_neq,7,1.0066612778220074e-06,1.4901174696935193e-08,1.0215624525189426e-06,True,True,20.5,13.5,1 +transfer_neq,8,5.309127742339492e-06,7.450589978308386e-09,5.316578332317801e-06,True,True,20.5,13.5,1 +transfer_neq,9,1.3828140735375194e-05,4.967061900673642e-09,1.3833107797275868e-05,True,True,20.5,13.5,1 +transfer_neq,10,2.2517463971680196e-05,7.0366557441969846e-09,2.2510427315936e-05,True,True,20.5,13.5,1 +transfer_neq,11,2.6241128339946074e-05,8.692339972804497e-09,2.623243599997327e-05,True,True,20.5,14.5,1 +transfer_neq,12,2.301816285713021e-05,1.0761948318616099e-08,2.3007400908811593e-05,True,True,20.5,14.5,1 +transfer_neq,13,1.7994855878653016e-05,6.6227364148296886e-09,1.7988233142238186e-05,True,True,16.5,20.5,3 +transfer_neq,14,1.325129952600701e-05,3.725288785783043e-09,1.3247574237221227e-05,True,True,17.5,20.5,3 +transfer_neq,15,1.102909472382868e-05,1.7074248230553035e-09,1.1030802148651736e-05,True,True,20.5,20.5,5 +transfer_neq,16,1.0516298765687881e-05,3.777030622292843e-09,1.0512521735065589e-05,True,True,20.5,20.5,5 +transfer_neq,17,7.773419831963446e-06,1.5522043823879006e-09,7.771867627581058e-06,True,True,20.5,20.5,5 +transfer_neq,18,6.4455684595787766e-06,2.4835230261199825e-09,6.4430849365526566e-06,True,True,16.5,3.5,4 +transfer_neq,19,6.882601883972939e-06,4.553130164564045e-09,6.8780487538083745e-06,True,True,16.5,3.5,4 +transfer_neq,20,8.06233390339417e-06,1.6556842147297246e-09,8.0639895876089e-06,True,True,3.5,15.5,2 +transfer_neq,21,9.1730277525931e-06,4.553133203799575e-09,9.1684746193893e-06,True,True,3.5,15.5,2 +transfer_neq,22,9.87202560678857e-06,1.241762831449833e-09,9.87078384395712e-06,True,True,3.5,15.5,2 +transfer_neq,23,9.794260003304078e-06,3.725291089495819e-09,9.790534712214582e-06,True,True,3.5,16.5,2 +transfer_neq,24,8.98628849999028e-06,6.208816516473092e-09,8.992497316506753e-06,True,True,3.5,17.5,2 diff --git a/research/fine_surface_joint_20261014/suction_signals.npz b/research/fine_surface_joint_20261014/suction_signals.npz new file mode 100644 index 0000000000000000000000000000000000000000..66d06cf2d909c3f381841bb05ae38c32e0a4f831 GIT binary patch literal 220058 zcmV(|K+(TYO9KQH000080000X0E0(+0%1x30Dxuy02Tlg0Ap`qa&u*0X>N37a%N#; zWnXnJZg6=401yCxW&i*H0001CN&o-=0002oyLntq-`h97_dY}OJkO`OlqOTCwUZ>7 z(m>`46-uL&sG~wuBvX-;k}`%OWUYfJN^7+BT@%G<+P7Hi^$)|6g`K#E@LU zk6$-D-_7XU$d3<)EP@c!j*(y&BUxaN<$~w4739^`e~DWzh4GS166t(C4R?~nP8`So zQGR(!@UHUt9)jyTP=DofAwGnD(5A9?Vf%+svT^u1|JCCavNH?Y%Zai}!Q*R!dkXW& zKjXuJh1a=+;->QXD=^P8urA@T2;=`wyb;18M*elZVN91Lg69JQFo+U_8)#>E2jcl3 z9{r2|D=2~+_6Hv!U;{a04?jK*2yynW97qj8`FyW`xgScHgdNsDC#dW=eta~TNu{Uo`B8vH%n-x&SV^_VVcjZ5 z_(&7PIxv^f6oK(_k#MQx$0q_iDlh}b+Xb@j7$0o{#v-{&7+;?l$t(HsTR=7|$VqVB z;dum$n1-M4KWqN?`>$fPEX90rk&G(j(+OY~%UfVyA1Fe09_Po$0$mm{3iE;pkt^Vn zFd*a!O-6Yfe$EUAPv8gN|FC!nr~0;Hd_JbQn*?zPL`jYyURMh6!6km_pFjARPH_c! zaV3ml^o3%7%w@C(W1PfNoV|E`|Eh63!yyLqfh(oD3qOAV#odDSnkdmKz{3nUl~UZo zkB@=uU;JwYIvCLlF9HOTd&np>`0vxRazn|A_m?z|!rE@WUjMyA~K0gk;W$?oJ z{6rwc-M?y-q_!XA(}@5v9Om=+8^9EjIPg2)a|w)(PBK^Ew_$!y)8vb=m*c=g)b<^WiblyHIdlu$UqQJP-j!QJ?nX^(`a02k`pt zkhur>{IyV)v^s|8RSZpk9FO zRSo$3HBgMvo`mOjS=K-wpaaf-T=edlc0308}`3Z_A z&0^BEn7PhxGzP}X3&BFdY#paH|_U)m%{juLe z#E1_=0=+tlbP&`vu|SJS_~P$xGl>a&{!*Atxe4qv2ToxUQ~rv(R3<^=I1rA1w|hKA zgyG{}EW+~N`u;BEvqKQCU^>+C>7OFCc4fyy^%6k*`%fFW|gy#uI2}*Mp)*T#*IK=0N!Ca~+5%a+BJZlMr zIISacD=^O-W-JfFzu!l4kK^A9@gd}q1+3^<`20*J0dU>p$|kh_YL5Umq496&l`bYR z?ytYw&#D*TXz}p8fJxZ@^}Ke{;Si1!;k=vKI+@R({!iBx5T6o0uZ40*!}jlEW-h`y zT#@16kL!gM>~4FUPp45_K|WsxnnZnm3<>hTP#^X)TWK5@`AjPZjGr3n+;)uPC6sd} z&ZjGw4lYN+d@1S;^PmWgLcwxKh~qd(Sxil!TC~xNw{L&{Ac{X=4;{gwoqIF9so&NWO4?M&!;4jhvQR@ zF+&iy5rVp_RZtgi16cLpI&2l?unEt1voQ_=U?`D&N07IM=LMT0-3hB)D4gGZ@q|e& z;tkKev|AY>fpx?4Gwz!#m^12!=O;dPe56Dx;XO9T4Cg(OZNwX*q;UBA4+K$${V&Zh ziNrkglw6RD{hT32v=0e*fuLlw@$)2z5Te+=byWQ->>r`Mc2O?-uugf$#CTf#hfiih zE|YNhxB7-8BRdA?saUbok|Zw;^iP&OMsc@;S$4!{f%b(7s!OMkt?6(q$(uzGNpL?w z-2Rmph^9NZ593PJ?iBC=aA6PvJja7tf+tx2`hUVlHhJl_K0q`VcvIn34h9dm`+V>Njzx=QBC?dM*Pe1C{=L~tqlgLdU zo^K16%Vqc+8lLmi({3|)d;U>(Kb~YMLZlA+WkJ#CcqT6g`ic?*g8Tr+iG004a59F! z|Ba6T_y-??IBgHX`Rg}6LO>KnY{qf&oaG?ky=X9*D%pz1RyNm$&)*6jQT{1>lmH$u z%_s5WH-btkIgKBm0G3l&A8>&)C7OfdDT&$bg84?1D##P)8Mtq&^kbs_7z~=0^o+`_ zfR}F=TTp%1pxN^Atz>&Syh|FaC3uJ6@4muPFr83;f^mD1>RgZG=l8nSfd+y&FR=G; zzPF-Uwqv_nQ02QZfB*K&FI))n)8zka{ha=bx2A(;l9!Kp_YY415k{+kXE%W!vibnl z7pKV1!#J;Pr=kSBx)})TZE;3jGS>gqWMn4JH$9}wAsl~oB*xup=tnx7<;QOVwxT>H z)&ufHb_YH$k3~3RKN-Y6UrGg*!%M782OQ7aOUB(2GkOev*B=4UPUgTCb)sW<-q(6U zGcV}d@bAN)#|9Kj_rX&lR#G^g&+Ur|QtSN!9Yl$rm=8G9P=M5#*U(#}TpQ=TkD|{C zn59+l8P%7F?YWVdZAIi}z-3h6Hk=P2nJDkge_nHxZ6vlt*FRJV5!Z z#&`=Ni8I(Qxg@Uu$LA7i#wLFJdU%amv<{Ds6ekhukR6QDRTwu(3?dlUIsd1llAyY zlLywpR*cFJ9N)7T+%O#9xykrGYh$8QExDF-g*2b$p=hrfSH z7Gz?)&{R?^wxb2P=o0?Dn82linoLla@ZxZuT5fI~#A-rNjX^}=^?$ozJx20#D;(DS z50nocPwpLlj^w%BHMQGWNI35stNU|_gUs;!^Xpq(N$2FyRVFbJpFe@0L@u(HLBDme zC3u&{l1(aRq9BIPGOSyd*l&2Fsqz&@kq$@kdRRLXuZyNXf(>MQHpcn$odH&4eIeXH z@wVabi>QWFfsO+GY{L4N{t@A+W1RoyCrg3O;zeQpn8I*bi}7`jaeOP$dIS{dl5VVu z>pAl$AA`~wJ$FmS0!unx1S#lVU<4LO% zcs%(FN8tiL%~+4)dkP~o7RS4A{JY)|9^dq3hy5)Qk75Fe*v zHD)ngE)CYfAgq|es4@Uqyf2RiV zqB{b8Zn6&RkoT!)zZ2<4U>D^OiThD=s7%3mK7bO-?HLm2)Ze-{2K2IX4KTmxGTI_A zzx=^Bv}bnjBZ#B0uHW8O)b1`63DD;#)9;{8YL4i6%YL|O=)}2rX(sYL9R5YiUlbi1 zI7YcYXQPPvDH`o!1j-Go{$l9e1=;uH%Gu%%VU|eHJ%UpRcTvgPas0lfBqIfRWH=r> z$kAEY@3Sd~-I%v$Q$F$7{&}QNG4^)|>2n_q_BR=TQJP?zpi`vt_Rc|xcV&qW;Yn$Y%-V~ejoVNY5P@L zzJ+#A)UWUP&;zf?s`Slw?}1r`D-K%qw!`hw?9t->51^U>_bW-97_Kvg_z>z3ZH84a z)*Y6V(-u5eqTF`j=jkJz1o|}=UT13B@#EtKIBOEbEf+p!DmwAwHwcdRxZv*}Gkyl( z_>Ljl^6_JZ8ny(x zw7>oe|6C7lkeIbM-EK&jKfu6*$ab0P0oY1nURVzL4vY<%vhx#kWwfrteeBJ4FMB1& zK7tpi>=c|=sJuI0$@EijHN{KEd{fBkp|RemVJ(`3c_WML%fay#AyQIJaE`*TQF1TD z+v?zA&(#UKO&_3X!QEObnm~6n>o4UTmqH<9)ov`$Rzh5-o?W8NYDl82(f0ZdHRR+| zcX`)FMZ_6W-`gE5hDJU)qikN#3s>b#nJImz8D^VwTT?!#;bI1{06(X&uB{^_58zSQ zx2_^>b8wy%@`OOQgyXomN+$2a@%YD%;0Kc!i|y%15z+X1sf2ee?vJtv?l+7-TY}KW z`)by|@=O36BuJWU1B;$Hr$RAHh??bqLx%Vs2Erb44TLQL^F~v*7{2)f8N)y~@ zc!f+pjMsJG^qNu3)=My!R6LIPWx`O*6}8Cc0^Vy~kL#Bt>y=OKJHHF{A{3cR)h_Xu zK+_nUAl$FWwiDkxzeE+?qpT8eeeiATfz@dtdZ>WnrQp5**HOwz`>-+kgAZ_HO}5w3 z^&`+((kBP|w`%Pp0hUG}AwEWr>8-1hGeUQnTxYBs+CJAyFVxUMzw3>q@K)`y(gssG z)JWleV*p(G`fGrz?+@5b;r-kw`1;U=WeSch!}||+$<_iK55N1_>p;SmH`j>tLSO;) zV#Ug9K$6FdP7U)n;Ao(c{d9+3V6a&9^%*Uau9@z@Nj}7&VVjhVX$l`)aaXFCr}7pU z)n%V<6X?{L(fNyq3@LQ9_3O+uo{W{*L>}{)Eq1f=C0QWJxBjn>vZy(>U*RQ!YWc@62FCufpS>`X8GA z+OJ(V%p=VtcQ2kx5RUQ$ZwCyY*2W{iXqH4cV zVr9P?l3(CF6Q0sVnVe&5Z`?LO0nN|8^MD~5SyVa2us{#(urN%^WSGt?``gPb&(AtHxNIkL7Iu)$%Q89PyPekQmeKLcSa&rqFRmMrhr`$>n3z< zvqCJw=Nq5i3j*DqD^9#sGnjlAp)zV*m z(Zl1layT6HN1uUBOW!s3-N^PB{_lFcrejQt?VaM^-+SZ|a0G$Ql} zsGgfz$!@O(E)R=hRIA%S-|H1?>m2%kVZTlKbTJlv|0#QD%u-4E{;Z8gsq)ga-^Alt zH)=#^4LkR;^D}yYCJQ7TPyPg%3&i%tsfwcSv+u2$vR77MpImkJUKzA*Nu$sG6D-uf ziZ?KZ*8@`)J+V~uX&J`HcGBS(_D9q&9TGF#M?FR5O$ylpwk>UVisU*TGLqGT4lga?nHt1!Ml2II7BC!T%`` z?)NI1isYUg{}r4h>$9o@FNQ0re8T-94pH4cLDT)w9tit=H zRa4Gr+Hd|xz3s^q^}x92l2?5QpG<*1OG;q{R>JY8`r}o4UPFx+O8n;gKj8Vqv7zJy`Nu-6Dq4MY_x(@l~sMZvje7`XQz29XJ z{-x0nMU5C(6#765Wi=@+RPK>MW@GkPIGpT*zIg}J728{e^FK1l#fBwP36I6Fvo7vuWv_fy1yOA^&mq(dg~na$lu5d}azbnaZHYytQ>%GFPV zmkIWc`6MaA73j%OU!JJXVYus&B^^H8eR{3e(Ba_FmH#)iE#=a;qN|Q7>s{st+e1Ag@paKd+H6F?w*!M!g|4V z{K`sgq>X;>W6;pBR;D24ks*S_&?P?F1~krZ)cN?r3@uN1zLIb|0*ZaDb-ewp&}Es+ z6q#EBiv4m#zB6sm=G8$gO0*ofEqWk2Vw(+0h>>1RiCzXPWK(@h%dL^4S?4#BcL6kf zjj$?sA>b34pcy3ZBxrelregO2V|10`ZzX&VfT)bUwl98Yq4HnvT||KvivjuVYoyTc z{g0&(5*wX}+)QBWGrN(IeFKbPs6Uide+9<2=zgV#dcmGSo0W`vESj?aP-HSimiCX| z`K;=S0)6gLz`*093iN}z%S+Ec5X3{qsY@%xhk#lC7|98hZ(vA-^ukkC;;7vB^+Sa! zMWlAqO)XDV1u0%rPMWwt0gXtjf;#e|=$iAJt(W)r!eeCWF}xoq)E}}Gb2lE1Df1n_ z-tYSLp6FU=N=laet~a8Shu=TsZU&L!d%B6-qrfVFXU8BegKJhNJ~C@>fx>IFy;xrz zSnGMmo^`n%I2Ud)7S!oLrN}UkAzKODKJ0!>CYOQ=Dma74&H3}5R6JNsl_X<--Uu)~ zMXH_yb(DiZ7stZ!(ZPcfR3pfzh!|X79eSggoIBVJ-jc)~%rE<5Mf4Ybpy(84{Ve?b z%1!s@l_|>7LzF`j#?u-F?#-53CHi;$uokQgi!LvxRp|=i7ZFdaotUB4_IQJBnX*ka4~c2=2M4$z=`9M-6>)vloQGF zY;clCuA|GBP}~$K^WJP#{d+Z}E^TE?5-D&;aLzc|OaslOn304aUc&v&){nfYB-A4? z%3_JnmjN;K`#k^;m`bd)!TUMkjRQMaffX>dd|QCVhG+2f8tJbLQ%p3BP2aL>ALNpCYmNU`{A|GQizl6B~oGb9ZE5XM4VR)82J6a zNTFVW>P)UD*5S)3A`;gp-6S^;_k;BbjwZp~0`m6q9Lf44z@ByT0i*96P#Jq`pLp(N zKm^`bl&!uDE*?3xQ_`md%&wJFRU%@b?Yf=C(!6u<_PQktWs|SKj|tLZVxpH|-h(0$ z7Vk7Xt1vR2Y8sq z;C#IABH)h-gPt)ToTQK?qaYUJ*vROFNWphibdYL_!8~mrf8mMyL_I_j&i#C}1I)Ft zj1Q_YMoIF#6#|I^D%{Iv+21fnX*GHbX7W`qFy`LX*Q=~h;BC8NmLTtcU!V2CwZ$5_ z4HSE@#P0*Ii785%J8Y2r_E~q?ryqdpVny3$&bL8hUN<_idg{TYa~qqsi&>+twndLv zfz{xI#`#gH&&^RxP+bV4^$K7v)W1E}-4M+ZgIxrt2&{DUYuJX=1nGv;$B*9$Y<4F0 zF{~fk z{d!-1GO#dH*10}jgC>cLAGmM)K+a@MxvD0O6zkJTha3RZ9xU!CRHZk(o%4k%ISQ`N z6@3xoB1bn{@1Mlt90S`*ANmHw{Qz%vKLVnH{E+eOs^L@XZ}5;?th$(hKOS!x!P&f7 z4qai+yCCLp7@qj#94oR%14&Q2Yr#fJUrWL8?4fGixS;dOjO^?-3#;eDVUp^5-g{+fP zu{}*#+{G9lzxTyw}cm-og zrz+qk8(gd2bQk1|EwnI)^w_+7}~;Xi$`@Q?C_y4TeZKt}?Z|3zvy4 zzN9sy4(7aAbX9WsEx4>VI9epM0_rhLqA`EHlD)T0>)g{}{gL3{GZIMj4Da(NePf=< z&}E}MvbzxLjUc&1MoX3g`bfGQ!1%5XR1FOF&_abIHR%qeq z%7=;xFF<76vbIjX1=_I8wN3PR0~jdY`cfp{6nz+RTAk%~3*@*j&lI)QL$izqAn8*I z+ySpj-2V{}r`IgeV0VMwC2ush-zMox=Tch3c+zzFvgV9i0^XRn`ugG_O?7%w17Vuu ztwF~%57bW5R-;>9EYO{{TY(;Z=TkuZA~r3esiaL8R)I?$;}zdpv5@Hfu#CVECA6+~ zLHqGWEmT~lXZ*H^gGxuguM+FgLT�PDCXtA&T8T5$kv1KG0K=n}cyOhK=86TQRH~ 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