loop_energetics.py — ½⟨111⟩ vs ⟨100⟩ interstitial-loop free energies and the
thermodynamic driving force for the *unary* (Dudarev) ½⟨111⟩ → ⟨100⟩ conversion.
Part of the ½⟨111⟩ → ⟨100⟩ loop-conversion work
(see ``docs/design_notes/loop_111_to_100_conversion.md``).
Physics
-------
Prismatic-loop free energy (Dudarev, Bullough & Derlet, PRL 100, 135503 (2008),
Eq. 5; equivalently Marian, Wirth & Perlado, PRL 88, 255507 (2002), Eq. 3):
E_l^X(n,T) = P_X(n) · [ F̂_X(T)·ln(4 R*_X(n) / (e·δ)) + F_δ^X + F_c^X ]
with X ∈ {111, 100}, P_X the loop perimeter, R*_X the equivalent-circle radius
of a platelet of n self-interstitials (area A = n·Ω/b_X), and δ ≈ 0.4 nm the
core cutoff. ½⟨111⟩ loops are hexagonal {110} (6 sides, b = (√3/2)a); ⟨100⟩
loops are square {100} (4 sides, b = a).
Temperature enters only through the ⟨100⟩ prelogarithmic factor, which softens
toward the α–γ transition as the analytic ⟨100⟩[100] solution
F̂_001([100]) ∝ √(c₁₁−c₁₂) ∝ (1 − T/T_c)^{1/4} (Dudarev Eq. 4); the
½⟨111⟩ factor is treated as ~T-independent:
F̂_100(T) = F̂_100^0 · (1 − T/T_c)^{1/4}, T_c = 1185 K.
Driving force for ½⟨111⟩ → ⟨100⟩ (favourable where positive):
ΔF(n,T) = E_l^111(n,T) − E_l^100(n,T).
Calibration
-----------
Rather than trust digitised absolute values of the elastic constants, the
overall ⟨100⟩ prelog magnitude F̂_100^0 is *derived* from a single calibration
target — the crossover temperature T* at a reference size n_ref where
ΔF(n_ref, T*) = 0 — via :meth:`LoopEnergetics.calibrate`. This guarantees, by
construction, that at the reference size ½⟨111⟩ is favoured below T* and ⟨100⟩
above it, matching the Dudarev Fig. 4 stability regions (sign change ≈ 350 °C,
strongly ⟨100⟩-favoured by ≈ 550 °C). The remaining size dependence of the
crossover then *emerges* from the loop geometry.
.. note::
The default core/prelog constants below are approximate (digitised from
Dudarev Figs. 2–3 + best-fit table). The *direction and magnitude* of the
size dependence of the crossover is sensitive to them and is a physics
calibration decision (Phase 6, against ``loop_burgers_fraction.py``); only
the qualitative T behaviour at the reference size is guaranteed by the
calibration. All constants are overridable on the dataclass.