53 """The abstract stoichiometric contract obeyed by every edge of a class.
57 n_precursor_clusters : int
58 Number of distinct *cluster* vertices consumed (0 for SOURCE).
60 Order of the reaction flux J_r in concentration: 0 for a pure
61 source, 1 for a unary (first-order) transition, 2 for a binary
62 collision. SOLUTE_TRAPPING spans both directions — trapping is
63 binary (cavity x gas reservoir), detrapping is unary — and is
64 recorded here as order 2 for the forward (trapping) edge.
65 consumes_monomer : bool
66 True if the reaction consumes a same-polarity point-defect monomer
67 from its pool (GROWTH) — distinct from a tracked cluster vertex.
69 True if the edge couples the chi = -1 and chi = +1 layers.
70 size_shift : int | None
71 Change in size n of the (surviving) cluster: +1, -1, 0, or None
72 when it is not fixed by the class (ANNIHILATION, COALESCENCE,
74 changes_population : bool
75 True if the edge moves the cluster between populations.
76 changes_composition : bool
77 True if the edge changes the trapped-solute composition vector.
79 True if the edge has no precursor cluster vertex (SOURCE).
80 destroys_to_sink : bool
81 True if the edge removes content to an untracked fixed sink (SINK).
83 One-line statement of the elementary transformation.
87 n_precursor_clusters: int
89 consumes_monomer: bool
91 size_shift:
"int | None"
92 changes_population: bool
93 changes_composition: bool
95 destroys_to_sink: bool
100EDGE_CLASS_SPEC:
"dict[EdgeClass, EdgeClassSpec]" = {
102 EdgeClass.GROWTH, 1, 2,
True,
False, +1,
False,
False,
False,
False,
103 "(chi,n,p,c) -> (chi,n+1,p,c) by absorption of a chi-monomer"),
105 EdgeClass.SHRINKAGE, 1, 2,
False,
True, -1,
False,
False,
False,
False,
106 "(chi,n,p,c) -> (chi,n-1,p,c) by impingement of a (-chi)-monomer"),
108 EdgeClass.DISSOCIATION, 1, 1,
False,
False, -1,
False,
False,
False,
False,
109 "(chi,n,p,c) -> (chi,n-1,p,c) by thermal emission of a chi-monomer "
110 "into the monomer pool; kernel involves a binding energy"),
112 EdgeClass.RECOMBINATION, 1, 2,
False,
True, -1,
False,
False,
False,
False,
113 "(chi,n,p,c) + (-chi,1) -> (chi,n-1,p,c); the (-chi)-monomer is "
114 "annihilated rather than returned to any pool"),
116 EdgeClass.ANNIHILATION, 2, 2,
True,
True,
None,
False,
False,
False,
False,
117 "(chi,n,p,c) + (-chi,n') -> (chi',|n-n'|,p_surv,c_surv); the "
118 "opposite-polarity analogue of coalescence (binary hyperedge)"),
120 EdgeClass.INTER_POPULATION, 1, 1,
False,
False, 0,
True,
False,
False,
False,
121 "(chi,n,p,c) -> (chi,n,p',c) with p' != p: segregation, sweeping, "
122 "or capture by a moving sink; changes only the population coordinate"),
124 EdgeClass.SOLUTE_TRAPPING, 1, 2,
False,
False, 0,
False,
True,
False,
False,
125 "(chi,n,p,c) <-> (chi,n,p,c +/- e_s): trapping (binary, cluster x gas "
126 "reservoir) or detrapping (unary); changes only the composition vector"),
128 EdgeClass.COALESCENCE, 2, 2,
False,
False,
None,
False,
False,
False,
False,
129 "(chi,n,p,c) + (chi,n',p,c') -> (chi,n+n',p,c+c'): same-polarity "
130 "binary growth (hyperedge with a quadratic rate kernel). An optional "
131 "product_population redirects the product to a different same-polarity "
132 "population (cross-population coalescence, e.g. <111>+<111> junction -> "
133 "<100>); the default (no product_population) keeps the product in the "
134 "reactant population, so changes_population is False for the base case."),
136 EdgeClass.SOURCE, 0, 0,
False,
False,
None,
False,
False,
True,
False,
137 "(empty) -> (chi,n,p,c) at a rate set by the displacement-cascade "
138 "or transmutation spectrum; the only edge with no precursor vertex"),
140 EdgeClass.SINK, 1, 1,
False,
False,
None,
False,
False,
False,
True,
141 "(chi,n,p,c) -> (sink) at a fixed sink (free surface, grain "
142 "boundary, dislocation); first-order loss, absorbs both polarities"),