213 """Verify the construction-guaranteed properties (not absolute eV values)."""
216 Tstar = le.T_star_C + _C_TO_K
220 def check(name, cond, *info):
223 print(f
" PASS {name} {info if info else ''}")
226 print(f
" FAIL {name} {info}")
229 check(
"dF(n_ref, T*) ~ 0",
230 abs(le.delta_F(nref, Tstar)) < 1e-9, le.delta_F(nref, Tstar))
232 check(
"dF(n_ref, T*-100K) < 0", le.delta_F(nref, Tstar - 100.0) < 0.0,
233 le.delta_F(nref, Tstar - 100.0))
234 check(
"dF(n_ref, T*+100K) > 0", le.delta_F(nref, Tstar + 100.0) > 0.0,
235 le.delta_F(nref, Tstar + 100.0))
237 Ts = np.linspace(300.0, Tc - 1.0, 50)
238 dF = le.delta_F(nref, Ts)
239 check(
"dF monotone increasing in T", np.all(np.diff(dF) > -1e-12))
241 Tc_ref = le.crossover_temperature(nref)
242 check(
"crossover_temperature(n_ref) ~ T*", abs(Tc_ref - le.T_star_C) < 1e-6,
245 check(
"perimeters > 0",
246 le.perimeter(10, 111) > 0
and le.perimeter(10, 100) > 0)
247 check(
"R* increasing with n", le.R_star(100, 111) > le.R_star(10, 111))
249 check(
"Fhat_100_0 in (0.1, 1.0) eV/A", 0.1 < le.Fhat_100_0 < 1.0,
254 mask = le.conversion_mask(T_op, 300)
255 sizes = np.arange(1, 301)[mask]
257 print(f
"\n [info] at {T_op-273.15:.0f} C, dF>0 (<100> favoured) for "
258 f
"sizes n in [{sizes.min()}, {sizes.max()}] "
259 f
"({'small-loop' if sizes.min()==1 else 'large-loop'} biased)")
261 print(f
"\n [info] at {T_op-273.15:.0f} C, no size has dF>0")
262 print(f
" [info] Fhat_100_0 = {le.Fhat_100_0:.4f} eV/A "
263 f
"(calibrated to T*={le.T_star_C:.0f} C at n_ref={nref:.0f})")
265 print(f
"\n{7 - fails}/7 checks passed")
266 return 1
if fails
else 0