# FULL COLLISION RUN
# =============================================================================
# FULL COLLISION RUN
# =============================================================================
print("\n[Launching full collision run...]")
t_max = 100.0
dt = 0.0005
n_steps = int(t_max / dt) # 200000
n_save = 400 # save every 0.2 time units
save_interval = n_steps // n_save # 500 steps
Psi = Psi_init.copy()
Psi_dot = Psi_dot_init.copy()
snapshots = []
times = []
energies = []
peaks = []
def save_snapshot(step, Psi):
snapshots.append(Psi.astype(np.complex64).copy())
times.append(step * dt)
energies.append(compute_energy(Psi))
peaks.append(float(np.max(np.abs(Psi))))
for step in range(n_steps + 1):
if step % save_interval == 0:
save_snapshot(step, Psi)
print(f" step={step:7d}/{n_steps}, t={step*dt:8.3f}, "
f"E={energies[-1]:.6e}, Peak={peaks[-1]:.4f}")
acc = acceleration_real(Psi)
Psi_dot_half = Psi_dot + 0.5 * dt * acc
Psi_new = Psi + dt * Psi_dot_half
acc_new = acceleration_real(Psi_new)
Psi_dot_new = Psi_dot_half + 0.5 * dt * acc_new
Psi = Psi_new
Psi_dot = Psi_dot_new
# =============================================================================
# SAVE COLLISION DATA
# =============================================================================
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
out_file = f"test_2_collision_0p30v_{timestamp}.npz"
np.savez(
out_file,
Psi_snapshots=np.array(snapshots),
times=np.array(times),
energies=np.array(energies),
peaks=np.array(peaks),
r_grid=r_grid,
z_grid=z_grid,
dr=dr,
dz=dz,
v=v,
v_boost=v_boost,
mu=mu,
lam=lam,
kappa=kappa,
m=m,
S_max=S_max,
Psi_sat=Psi_sat
)
print(f"\n✓ Full collision run complete. Data saved to: {out_file}")
print("="*80)