Particle Collision
Two COMPLEX-field solitons boosted at ±0.1c collide head-on. GOV-01 + GOV-02 handle everything: energy conservation is verified at <0.04 %, collision events are detected automatically, and outgoing fragments are counted.
What you'll measure
- ›Peak trajectories along the collision axis — approach, overlap, scatter
- ›Collision-event detection: step number, type, and peak separation at contact
- ›Total energy before and after: |ΔE|/E < 0.1 % confirms conservation
- ›Fragment count and impact parameter — increase
SEPor offset one soliton laterally for inelastic events
Collider Context — Same Laws, Different Scale
At the LHC two proton beams collide at √s = 13.6 TeV. What is conserved in every event is exactly what is conserved here: total energy and total momentum. The LHC measures ⟨Nch⟩ ≈ 70 charged tracks per minimum-bias event; this simulation measures discrete soliton fragments from a head-on χ-well collision.
Scale is different; the conservation laws are identical. Run paper_experiments/collider_lhc_style.py for a full 3×3 event sweep (velocity × impact parameter) with LHC-style ASCII event logs and aggregate statistics.
Full script
"""18 - Particle Collision: Boosted Solitons on a COMPLEX Grid
Two solitons are constructed at opposite ends of the z-axis and given
equal-and-opposite boosts of +v and -v (in lattice units, v/c). The
simulation evolves under GOV-01 (COMPLEX field) + GOV-02 until the
solitons have passed through each other, then reports:
* Peak positions tracked over time (approach, collision, scatter)
* Collision event detection: when peaks are within one sigma
* Total energy before and after collision (conservation test)
* Impact parameter (b = 0 head-on here, adjustable)
* Outgoing fragment count
GOV-01 + GOV-02 are the ONLY physics — no Coulomb, no QED.
"""
import numpy as np
import lfm
from lfm.constants import KAPPA, LAMBDA_H
N = 64
AMP = 6.0
V = 0.10 # soliton speed in units of c
STEPS = 3_000
SEP = 24 # separation between soliton centres (cells)
SIGMA = 3.0 # soliton width
cfg = lfm.SimulationConfig(
grid_size=N,
field_level=lfm.FieldLevel.COMPLEX,
kappa=KAPPA,
lambda_self=LAMBDA_H,
dt=0.02,
)
sim = lfm.Simulation(cfg)
print("18 - Particle Collision: Boosted Solitons")
print("=" * 60)
print(f" velocity: v/c = {V:.2f}")
print(f" separation: {SEP} cells, sigma = {SIGMA}")
print(f" steps: {STEPS}")
cx = cy = N // 2
z1 = cx - SEP // 2
z2 = cx + SEP // 2
# Place solitons with opposite boosts
sim.place_soliton((cx, cy, z1), amplitude=AMP, velocity=(0, 0, +V))
sim.place_soliton((cx, cy, z2), amplitude=AMP, velocity=(0, 0, -V))
sim.equilibrate()
E_before = sim.total_energy()
b = lfm.compute_impact_parameter(sim, axis=2)
print(f"\nInitial total energy: {E_before:.6f}")
print(f"Impact parameter b: {b:.3f} cells")
print("\nRunning collision...")
result = sim.run(
steps=STEPS,
record_metrics=True,
track_peaks=True,
track_interval=100,
)
E_after = sim.total_energy()
events = lfm.detect_collision_events(result.peak_tracks, sigma=SIGMA)
n_frag = lfm.count_fragments(sim.psi_real, sim.chi, threshold=0.15)
dE_pct = 100.0 * abs(E_after - E_before) / E_before
print("\nCollision summary")
print("-" * 60)
print(f" E before: {E_before:.6f}")
print(f" E after: {E_after:.6f}")
print(f" |DeltaE|/E: {dE_pct:.4f} %")
print(f" Events detected:{len(events)}")
for ev in events:
print(f" step {ev['step']:5d} type={ev['type']:<10s} "
f"separation={ev['separation']:.2f} cells")
print(f" Outgoing frags: {n_frag}")
# Peak trajectory table (abridged)
tracks = result.peak_tracks
steps_shown = list(tracks.keys())[::len(tracks)//10 or 1]
print("\nPeak-position snapshots (z-axis):")
print(f" {'step':>6} {'z_peak_1':>10} {'z_peak_2':>10}")
for s in steps_shown:
pts = tracks[s]
zvals = sorted(p['z'] for p in pts)
z1s = f"{zvals[0]:10.1f}" if len(zvals) > 0 else " --"
z2s = f"{zvals[1]:10.1f}" if len(zvals) > 1 else " --"
print(f" {s:6d} {z1s} {z2s}")
print("\n" + "=" * 60)
print(f"Energy conservation: {'PASS' if dE_pct < 1.0 else 'FAIL'} ({dE_pct:.4f} %)")
print(f"Collision detected: {'YES' if events else 'NO'}")
print(f"Fragments at end: {n_frag}")Expected output
18 - Particle Collision: Boosted Solitons
============================================================
velocity: v/c = 0.10
separation: 24 cells, sigma = 3.0
steps: 3,000
Initial total energy: 142.831446
Impact parameter b: 0.000 cells
Running collision...
Collision summary
------------------------------------------------------------
E before: 142.831446
E after: 142.783201
|DeltaE|/E: 0.0338 %
Events detected:1
step 810 type=approach separation=5.83 cells
Outgoing frags: 2
Peak-position snapshots (z-axis):
step z_peak_1 z_peak_2
0 20.0 44.0
300 22.8 41.2
600 25.7 38.3
900 32.1 32.9
1200 37.5 26.4
1500 41.1 22.8
1800 44.0 20.0
2100 44.0 20.0
2400 44.0 20.0
2700 44.0 20.0
============================================================
Energy conservation: PASS (0.0338 %)
Collision detected: YES
Fragments at end: 2Interpretation
A boosted soliton is an exact Lorentz-boosted eigenmode of GOV-01: the χ-well moves with the amplitude profile and remains stable while sub-luminal. At v/c = 0.10 the Lorentz factor γ ≈ 1.005 — relativistic corrections are small but present (tutorial 16 measures them explicitly).
During overlap the solitons exchange energy through χ-well interference. Most of this energy is returned elastically — the solitons re-emerge and travel onward. The small |ΔE|/E reflects radiation emitted during the χ-well overlap, analogous to bremsstrahlung.
Try setting V = 0.40 or offsetting one soliton laterally by 6 cells to observe inelastic scattering with 3+ output fragments.