spin_paper/archive/experimental-scripts/generate_radius_table_data.py

121 lines
4.0 KiB
Python

#!/usr/bin/env python3
"""
generate_radius_table_data.py
Generate exact data for the radius approaches comparison table.
"""
import numpy as np
# Constants
HBAR = 1.054571817e-34
ME = 9.1093837015e-31
E = 1.602176634e-19
K = 8.9875517923e9
A0 = 5.29177210903e-11
def calculate_force_approaches(element_name, shells_data):
"""Calculate forces using different radius approaches"""
results = {}
# Extract shell information
radii = []
electrons = []
z_effs = []
for n, l, num_e, z_eff in shells_data:
r = n * A0 / z_eff
if l == 2: # d-orbital
r *= 0.35
radii.append(r)
electrons.append(num_e)
z_effs.append(z_eff)
# Total electrons
total_e = sum(electrons)
# 1. Outermost approach (our method)
r_outer = radii[-1]
z_eff_outer = z_effs[-1]
s = 1 if len(radii) == 1 else 1 # simplified
F_outer = HBAR**2 * s**2 / (ME * r_outer**3)
F_coulomb_outer = K * z_eff_outer * E**2 / r_outer**2
# 2. Mean radius
r_mean = sum(r * n_e for r, n_e in zip(radii, electrons)) / total_e
# Use average Z_eff
z_eff_mean = sum(z * n_e for z, n_e in zip(z_effs, electrons)) / total_e
F_mean = HBAR**2 * s**2 / (ME * r_mean**3)
F_coulomb_mean = K * z_eff_mean * E**2 / r_mean**2
# 3. RMS radius
r_rms = np.sqrt(sum(r**2 * n_e for r, n_e in zip(radii, electrons)) / total_e)
F_rms = HBAR**2 * s**2 / (ME * r_rms**3)
# 4. Innermost (1s)
r_inner = radii[0]
z_eff_inner = z_effs[0]
F_inner = HBAR**2 * s**2 / (ME * r_inner**3)
F_coulomb_inner = K * z_eff_inner * E**2 / r_inner**2
results = {
'element': element_name,
'F_outer': F_outer,
'F_mean': F_mean,
'F_rms': F_rms,
'F_inner': F_inner,
'F_coulomb': F_coulomb_outer, # Use outer for comparison
'agreement_outer': (F_outer/F_coulomb_outer) * 100,
'agreement_mean': (F_mean/F_coulomb_outer) * 100,
'agreement_rms': (F_rms/F_coulomb_outer) * 100,
'agreement_inner': (F_inner/F_coulomb_outer) * 100
}
return results
# Define test elements
elements = {
'Hydrogen': [(1, 0, 1, 1.00)],
'Helium': [(1, 0, 2, 1.69)],
'Carbon': [(1, 0, 2, 5.67), (2, 0, 2, 3.22), (2, 1, 2, 3.14)],
'Neon': [(1, 0, 2, 9.64), (2, 0, 2, 6.52), (2, 1, 6, 6.52)],
'Iron': [(1, 0, 2, 25.38), (2, 0, 2, 22.36), (2, 1, 6, 22.36),
(3, 0, 2, 13.18), (3, 1, 6, 13.18), (3, 2, 6, 9.1), (4, 0, 2, 3.75)]
}
# Calculate and print results
print("LaTeX Table Data for Radius Approaches Comparison")
print("=" * 70)
for elem_name, shells in elements.items():
results = calculate_force_approaches(elem_name, shells)
print(f"\n{elem_name}:")
print(f" Forces (N):")
print(f" Outermost: {results['F_outer']:.2e}")
print(f" Mean: {results['F_mean']:.2e}")
print(f" RMS: {results['F_rms']:.2e}")
print(f" Innermost: {results['F_inner']:.2e}")
print(f" Coulomb: {results['F_coulomb']:.2e}")
print(f" Agreement (%):")
print(f" Outermost: {results['agreement_outer']:.2f}")
print(f" Mean: {results['agreement_mean']:.2f}")
print(f" RMS: {results['agreement_rms']:.2f}")
print(f" Innermost: {results['agreement_inner']:.2f}")
print("\n" + "=" * 70)
print("LaTeX formatted (forces):")
print("Element & Outermost & Mean & RMS & Innermost & Coulomb \\\\")
for elem_name, shells in elements.items():
r = calculate_force_approaches(elem_name, shells)
print(f"{elem_name:9} & ${r['F_outer']:.2e}$ & ${r['F_mean']:.2e}$ & "
f"${r['F_rms']:.2e}$ & ${r['F_inner']:.2e}$ & ${r['F_coulomb']:.2e}$ \\\\")
print("\nLaTeX formatted (agreement %):")
print("Element & Outermost & Mean & RMS & Innermost \\\\")
for elem_name, shells in elements.items():
r = calculate_force_approaches(elem_name, shells)
print(f"{elem_name:9} & {r['agreement_outer']:.2f} & {r['agreement_mean']:.2f} & "
f"{r['agreement_rms']:.2f} & {r['agreement_inner']:.2f} \\\\")