Score T9 on the EUROFER97 character CROSSOVER, per parameter vector.
WHY NOT score_T4. score_T4 compares ONE row to ONE datum. The character target
is not a value at a temperature -- it is a trend across two:
300 C / 15 dpa -> f_100_tem_1 < 0.5 (1/2<111> dominant)
350 C / 16.3 dpa -> f_100_tem_1 > 0.5 (<100> dominant)
Neither end alone is sufficient. A theta that converts uniformly too little
passes the cold end and fails the hot one; a theta that converts uniformly too
much does the reverse. Only the PAIR pins the crossover temperature, which is
the quantity E_a0_conv actually sets. So rows are grouped by theta_id (both
conditions carry the same parameter vector) and scored jointly.
The 330 C datum is deliberately NOT used for character -- its database cell is a
crossover statement, not an assignment (see targets_T4.json
_character_correction). It still pins size and density and is scored separately
when available.
REPORTED, NOT SCORED: whether d_111 clears the 1.0 nm TEM cutoff. That is the
diagnostic the whole widened box exists to move -- if d_111 stays below 1 nm
everywhere, the 1/2<111> population is invisible by construction and no amount
of parameter search can make the character come out right, which is a structural
finding rather than a bad fit.
Usage:
python score_crossover.py --rows t9.jsonl [--design design/T9_crossover.csv]