Nucleide

Enrichment cascades

Matched-abundance-ratio cascade model, separation factors, and SWU used by Nucleide.

Nucleide solves matched-abundance-ratio cascades (MARCs) for multicomponent isotope mixtures. The model separates a feed stream into an enriched product stream and a depleted tails stream using a train of ideal stages.

Overview

A cascade is specified by:

  • An overall stage separation factor α>1\alpha > 1.
  • A mass separation factor MM^* between the masses of the enriching key jj and the stripping key kk.
  • Numbers of enriching stages NN and stripping stages MM.
  • Target assays of the key nuclide jj in the feed (xFx_F), product (xPx_P), and tails (xTx_T).
Where this lives in the code

The implementation is in crates/enrichment/src/cascade.rs. The public API is Cascade::default_uranium() and Cascade::solve() in Python.

Per-nuclide stage separation factor

For a nuclide of atomic mass MiM_i, the effective stage separation factor is

αi=αMMi.\alpha^*_i = \alpha^{\,M^* - M_i}.
  • αi=1\alpha^*_i = 1 when Mi=MM_i = M^*.
  • αi>1\alpha^*_i > 1 for nuclides lighter than MM^* (enriched toward the product).
  • αi<1\alpha^*_i < 1 for nuclides heavier than MM^* (enriched toward the tails).
Keys

The enriching key jj is the nuclide desired in the product (e.g. U-235). The stripping key kk is the nuclide desired in the tails (e.g. U-238). MM^* must lie strictly between MjM_j and MkM_k.

Stream mass ratios

For the key nuclide jj, the product-to-feed, tails-to-feed, and tails-to-product ratios follow directly from assay conservation:

PF=xFxTxPxT,TF=xFxPxTxP,TP=xFxPxTxF.\frac{P}{F} = \frac{x_F - x_T}{x_P - x_T}, \qquad \frac{T}{F} = \frac{x_F - x_P}{x_T - x_P}, \qquad \frac{T}{P} = \frac{x_F - x_P}{x_T - x_F}.

Stage-count equations

For the key nuclide jj, the cascade geometry must satisfy two abundance-ratio product relations:

PFxPxF=(αj)M+11(αj)M+1(αj)N,\frac{P}{F}\,\frac{x_P}{x_F} = \frac{(\alpha^*_j)^{M+1} - 1}{(\alpha^*_j)^{M+1} - (\alpha^*_j)^{-N}}, TFxTxF=1(αj)N(αj)M+1(αj)N.\frac{T}{F}\,\frac{x_T}{x_F} = \frac{1 - (\alpha^*_j)^{-N}}{(\alpha^*_j)^{M+1} - (\alpha^*_j)^{-N}}.

Nucleide solves these two equations for NN and MM with a fixed-point iteration. If the stage counts collapse, the solver restarts from a slightly larger seed and continues.

Full product and tails compositions

Once NN and MM are known, the composition of every component ii in the product and tails is

xP,i=xF,i((αi)M+11)((αi)M+1(αi)N)/(P/F),x_{P,i} = \frac{x_{F,i}\,\big((\alpha^*_i)^{M+1} - 1\big)}{\big((\alpha^*_i)^{M+1} - (\alpha^*_i)^{-N}\big) / (P/F)}, xT,i=xF,i(1(αi)N)((αi)M+1(αi)N)/(T/F).x_{T,i} = \frac{x_{F,i}\,\big(1 - (\alpha^*_i)^{-N}\big)}{\big((\alpha^*_i)^{M+1} - (\alpha^*_i)^{-N}\big) / (T/F)}.

Solving the cascade

The outer secant loop adjusts NN and MM until the computed key assays match xPx_P and xTx_T within tolerance. Near convergence, floating-point noise can stall the secant updates; Nucleide keeps the best iterate and accepts it when improvement stops inside a bounded noise floor.

Optimizing MM^*

For a multicomponent feed, MM^* is chosen to minimize the total inter-stage flow rate per unit feed:

LtF.\frac{L_t}{F}.

Nucleide performs a sign-tracking descent on MM^*, followed by a golden-section polish, re-solving the cascade at each trial value. Probes that fail to converge are treated as having an infinitely large flow rate, so the optimizer moves away from them rather than using unconverged values. The optimal MM^* is typically close to, but not exactly at, the midpoint of the two key masses.

Separative work (SWU)

The separative work per unit feed is computed from the value function

V(x)=(2x1)lnx1x,V(x) = (2x - 1)\,\ln\frac{x}{1-x},
Loading chart…

or, in the multicomponent form used by Nucleide, from the per-component separative-power ratio

ΔUiG=ln(αj)  αi1αi+1.\frac{\Delta U_i}{G} = \ln(\alpha^*_j)\;\frac{\alpha^*_i - 1}{\alpha^*_i + 1}.

The total SWU per unit feed is built from the key-nuclide abundance ratio of each stream, rs=xs,j/xs,kr_s = x_{s,j} / x_{s,k}:

SWU/F=i[PFxP,ilnrP+TFxT,ilnrTxF,ilnrF],\text{SWU}/F = -\sum_i \left[ \frac{P}{F}\,x_{P,i}\,\ln r_P + \frac{T}{F}\,x_{T,i}\,\ln r_T - x_{F,i}\,\ln r_F \right],

and the SWU per unit product is

SWU/P=SWU/FP/F.\text{SWU}/P = \frac{\text{SWU}/F}{P/F}.
Units

Stream masses and SWU values are normalized to a 1 kg feed when using the default uranium cascade. Scale by the actual feed or product mass as needed.

Worked example: default uranium cascade

ParameterValue
Stage separation factor α1.05
Mass separation factor M*236.5
Enriching key jU-235
Stripping key kU-238
Initial enriching stages N30
Initial stripping stages M10
Feed assay x_F0.0072
Product assay x_P0.05
Tails assay x_T0.0025
Default uranium cascade parameters from Cascade::default_uranium_cascade().
  1. Compute stream mass ratios:

    P/F=(0.00720.0025)/(0.050.0025)0.09895,P/F = (0.0072 - 0.0025)/(0.05 - 0.0025) \approx 0.09895,T/F=(0.00720.05)/(0.00250.05)0.90105.T/F = (0.0072 - 0.05)/(0.0025 - 0.05) \approx 0.90105.
  2. Solve the stage-count equations for NN and MM using α235=1.05236.5235.0439\alpha^*_{235} = 1.05^{236.5 - 235.0439}.

  3. Compute full product and tails isotopics for U-234, U-235, and U-238 from the stage-count solution.

  4. Evaluate Lt/FL_t/F and SWU/F/F, then SWU/P=(SWU/F)/(P/F)/P = (\text{SWU}/F)/(P/F).

Running Cascade.default_uranium().solve() performs all of these steps and returns the converged cascade object.

Assumptions and limitations

  • Ideal stages: each stage achieves the same separation factor α\alpha.
  • Matched abundance ratios: the cascade is a symmetric MARC; non-ideal mixing losses are not modeled.
  • M between key masses*: solve_numeric rejects a user-supplied MM^* that lies outside the open interval between the two key masses; multicomponent resets an out-of-range initial guess to the midpoint of the key masses.
  • Numeric solver only: symbolic cascade solvers are out of scope.
  • Materials-free: enrichment math operates on mass fractions, independent of the material crate.

Adjacent capabilities found in PyNE and the literature that Nucleide does not implement:

  • Symbolic cascade solver: PyNE’s default multicomponent path uses an auto-generated closed-form solver (enrichment_symbolic20); Nucleide only implements the numeric secant/fixed-point path.
  • Flow-minimization criterion: the idea of minimizing total inter-stage flow per unit feed originates with A. de la Garza, AECOP-330 (1969), cited in PyNE’s documentation.
  • Q-cascade optimization: recent work generalizes MARC analysis and optimizes cascade tapering; see Zeng et al. (zeng-2014, zeng-2018).
  • Non-uranium isotopes: the same mathematics applies to stable-isotope cascades (e.g. isotopically modified molybdenum, Borisevich et al. 2017, Chemical Engineering Research and Design 128, 257–264), though Nucleide’s defaults target uranium.