ThermoMigrate

version 4.0.2

Processing...

Final Concentration Profile (2D) t = FINAL

Concentration Evolution (3D)

Final Figure of Merit zT (2D) Avg ZT: -

ZT Evolution (3D)

Final Seebeck Coefficient (2D)

Seebeck Evolution (3D)

Final Conductivity (2D)

Conductivity Evolution (3D)

User Guide

ThermoMigrate - Thermoelectric dopant-migration simulator

version 4.0.2 - NitaD, Univ Paris-Saclay, 12 july 2026

Getting Started

1

Pick a system & dopant

Choose a host material in Material System, then a dopant preset. This auto-fills D₀, Ea, and Q* with literature-calibrated values.

2

Set the gradient & duration

Define T_Hot, T_Cold, leg length, and anneal duration in the Thermal Gradient card. These drive both diffusion and Soret transport.

3

Read the results

Switch between the four result tabs, and toggle 2D Final vs 3D Timeline in the header to see the final profile or its full time evolution.

Every change re-runs the simulation automatically (with a short debounce) in a background worker thread, so the interface stays responsive even for long, high-resolution anneals.

Interface Guide

Material System

Selects the thermoelectric host: PbSe, SnSe, MgAgSb (α-phase only), or Bi2(Se,Te)3. Each has its own mobility, band gap, and lattice thermal conductivity model, its own list of calibrated dopants, and its own valid temperature range tied to that material's real stability limit (see Thermal Gradient below).

Thermal Gradient

T_Hot (left, x=0) and T_Cold (right, x=1) set a fixed linear temperature profile across the Leg Length (2–∞ mm). Both temperatures are capped to the selected material's real stability range (shown live under the fields) and stay at least 300 K. |T_Hot−T_Cold| / Leg Length is also capped at 40 K/mm — violating it blocks the run with an explanation rather than silently clamping anything. Anneal Duration, folded into the same card, sets the total simulated time in days.

Dopant

The preset dropdown loads typical D₀, Ea, and Q* for a dopant/host pair. Pick Custom Params to type your own, and use Concentration for a constant value or a Smart Input formula (see below).

Result Tabs & View Toggle

Conc, ZT, Seebeck, Sigma each show a 2D final-state chart and a 3D evolution surface. The header toggle switches all tabs at once between 2D Final (initial vs. final snapshot) and 3D Timeline (~40 sampled snapshots across the anneal).

Export Data

Downloads a CSV with time, position, concentration, ZT and sigma.

How to use "Smart Input"

The Concentration field accepts JavaScript math expressions evaluated over the normalized position x. Use it to define graded initial doping profiles for Functionally Graded Materials (FGM) studies.

The Variable 'x'

  • x = 0.0 Hot Side (Left)
  • x = 1.0 Cold Side (Right)

The profile is normalized to leg length, regardless of the value entered there.

Supported Math

exp(x) log(x) pow(a,b) sin(x) cos(x) sqrt(x)

Standard operators (+, -, *, /) and ternaries (cond ? a : b) also apply.

Profile Library

Copy and paste these directly into the Concentration input field to test different scenarios.

Profile Type Equation Example Why test this?
Constant (Flat) 1e19 The standard baseline.
Linear Grading 2e19 * (1 - 0.5*x) Starts at 2e19, drops to 1e19 Optimizes $zT$ by matching carrier conc to temperature ($n \propto T^{1.5}$).
Exponential 1e19 * exp(2*x) Rapidly increasing dopant towards the cold side.
Step Function x < 0.5 ? 2e19 : 1e18 Simulates a diffusion couple (high conc joined to low conc).
Parabolic 1e19 * (1 + 4*x*(1-x)) Peak concentration in the middle of the leg.
Gaussian Bump 1e19*(1+3*exp(-pow((x-0.5)/0.15,2))) A localized doping spike, e.g. from a mid-leg implant or diffusion source.
Smooth Step (Sigmoid) 1e18+1e19/(1+exp(-10*(x-0.5))) Same junction as the step function but continuous, which is gentler on the numerical solver.

Material Systems

Four thermoelectric hosts are modeled. Each has its own transport-property fit (see Physics Model for the equations and Default Parameters for every constant) and its own allowed temperature window, enforced by the Thermal Gradient card and tied to that material's real stability limit rather than one generic range.

A. PbSe (Lead Selenide)

A rock-salt IV–VI narrow-gap semiconductor and, alongside PbTe, one of the leading mid-to-high-temperature thermoelectrics: strong band convergence and intrinsically low lattice thermal conductivity give optimized bulk/nanostructured samples zT ≈ 1.3–1.8 in the 800–950 K range. Dopants here are treated as simple substitutional/interstitial point defects (Na, Ag, Cu, Cl).

Melting point1338–1351 K (1065–1078°C)
Tool's allowed T range300–1300 K — ~45–50 K margin below melting
Band gap Eg (model)0.28 eV
Available dopantsNa, Ag, Cu, Cl, Custom

B. SnSe (Tin Selenide)

A layered orthorhombic IV–VI semiconductor, famous since Zhao et al. (Nature, 2014) for ultralow single-crystal lattice thermal conductivity along the b-axis, giving a record zT ≈ 2.6–2.8 near 800–950 K. It undergoes a structural Pnma→Cmcm phase transition around 750 K that further improves performance in the high-T phase; this tool adds a small extra thermal-conductivity term above 750 K to reflect that (see Physics Model, part D).

Melting point1134 K
Tool's allowed T range300–1100 K — keeps the 750 K transition and the near-melting zT peak accessible
Band gap Eg (model)0.86 eV
Available dopantsNa, Ag, K, Custom

C. MgAgSb — α-phase only

A low-to-mid-temperature p-type thermoelectric valued for a high power factor and low lattice thermal conductivity near room temperature (reported peak zT ≈ 1.2–1.4 near 475 K), attractive for waste-heat and wearable applications below ~200°C. MgAgSb exists in three polymorphs; only the low-temperature α-phase has this favorable transport behavior. It transforms to a β-phase (and eventually γ) above roughly 560 K, with different, unmodeled transport — so this tool restricts simulation to the α-phase window only, unlike the other three materials where the ceiling is set by melting.

α→β transition≈560–573 K (true melting point is much higher, but irrelevant — the modeled phase doesn't survive that far)
Tool's allowed T range300–560 K — the entire range stays in the α-phase
Band gap Eg (model)0.18 eV
Available dopantsAg, Zn, Ni, Custom
Switching to MgAgSb from another material does not pick a new default gradient — if T_Hot/T_Cold are outside 300–560 K they're clamped independently, which can collapse the gradient to 0 K until you set new values.

D. Bi2(Se,Te)3

The benchmark commercial thermoelectric for near-room-temperature Peltier cooling and power generation — essentially every commercial TE module uses a Bi2Te3-based alloy. Alloying with Bi2Se3 (n-type) or Sb2Te3 (p-type) reduces lattice thermal conductivity below that of pure Bi2Te3; this tool's parameters target that optimized-alloy regime (klat ≈ 0.6 W/m/K at 300 K, vs. ≈1.2 W/m/K reported for unalloyed single-crystal Bi2Te3). Its narrow gap causes significant bipolar carrier excitation even near 300 K — the main reason its useful range is so much lower than the other three materials here, and why the field keeps searching for wider-gap alternatives for higher-T service. This tool's simplified single-parabolic-band model reaches zT ≈ 0.9–1.1 near room temperature (optimized, nanostructured real samples reach higher, up to ≈1.2–1.4, via mechanisms — band convergence, nanostructuring — this simple model doesn't capture).

Melting point858 K (585°C)
Tool's allowed T range300–800 K
Band gap Eg (model)0.14 eV — narrowest of the four, dominant limitation
Available dopantsCu, Ag, I, Custom

Cu's D₀/Ea (1.7×10⁻&sup6; m²/s, 0.25 eV) come from a 2-point Arrhenius fit to two independent literature diffusion measurements — single-crystal fast-axis diffusion ≈1×10⁻¹⁰ m²/s at 300 K, and an effective sintered-pellet value ≈4×10⁻&sup9; m²/s at 483 K. It's the only dopant preset in this tool anchored to real measurements rather than estimated by analogy; see Default Parameters for the full table and its caveats.

Physics Model

A. Conservation Law

Dopant concentration $C(x,t)$ obeys a 1D continuity equation — the flux $J$ defined below is the only thing that moves mass around, and the zero-flux boundaries (part E, Numerical Method) mean nothing enters or leaves the leg:

$\dfrac{\partial C}{\partial t} = -\dfrac{\partial J}{\partial x}$

B. The Soret Effect

Dopants migrate under the temperature gradient via thermodiffusion (thermomigration). The net atomic flux combines ordinary Fickian diffusion with a thermal-gradient (Soret) term:

$J = -D\left(\dfrac{\partial C}{\partial x} + \dfrac{C\,Q^*}{k_B T^2}\dfrac{\partial T}{\partial x}\right)$

The direction of net migration is set by the sign of the Heat of Transport ($Q^*$):

  • If Q* > 0: Dopants move to the COLD side.
  • If Q* < 0: Dopants move to the HOT side (Thermophilic).

The diffusivity itself follows an Arrhenius law with prefactor $D_0$ and activation energy $E_a$ (both per-dopant, set in the sidebar or a preset):

$D(T) = D_0\,\exp\!\left(-\dfrac{E_a}{k_B T}\right)$

Note the model assumes complete ionization: the simulated dopant concentration $C$ is used directly as the free-carrier concentration in every transport equation below, with no separate ionization-fraction or trap-state treatment.

C. Mobility, Conductivity & Seebeck Coefficient

Carrier mobility follows a power law in temperature, with material-specific prefactor $\mu_0$ and exponent $m$ (values in Default Parameters):

$\mu(T) = \mu_0 \left(\dfrac{T}{300}\right)^{-m} \qquad \sigma = C\,e\,\mu$

The Seebeck coefficient starts from a Pisarenko-like baseline at 300 K (material constants $A$, $B$, $C_{ref}$), then gets a linear high-T boost before bipolar suppression is applied:

$S_{300}(C) = A - B\big(\log_{10}C - C_{ref}\big) \qquad S_T = S_{300}\big(1 + s\,(T-300)\big)$

$s$ is the per-material "Seebeck slope" listed in Default Parameters. For SnSe specifically, $S_T$ is additionally capped at 550 µV/K before bipolar suppression, to prevent runaway growth at low doping/high T that the simple linear boost would otherwise produce — the other three materials didn't need this in testing but could in principle at extreme enough inputs.

D. Thermal Conductivity & Figure of Merit (zT)

Total thermal conductivity sums a material-specific lattice term, an electronic term from the Wiedemann–Franz law (Lorenz number $L_0=2.4\times10^{-8}$ W·Ω/K²), a bipolar term, and — for SnSe above 750 K only — a phase-transition term:

$\kappa_{tot} = \kappa_{lat}(T) + \underbrace{L_0\,\sigma\,T}_{\kappa_{elec}} + \underbrace{20\left(\frac{T}{300}\right)\xi}_{\kappa_{bi}} + \kappa_{phase}$

which combines with $S_T$ (after bipolar suppression, part below) and $\sigma$ into the figure of merit:

$zT = \dfrac{S^2 \sigma}{\kappa_{tot}}\,T$

where $S$ is the Seebeck coefficient, $\sigma$ the electrical conductivity, and $\kappa_{tot}$ the total thermal conductivity (lattice + electronic + bipolar [+ phase, SnSe only]). The Avg ZT badge on the ZT tab averages this value across the leg at the final simulated (or truncated) time.

E. High-Temperature Accuracy (Bipolar Correction)

To prevent unrealistic $zT$ predictions at high temperatures (where standard single-band models fail), this simulation uses a bipolar correction calibrated to typical TE data. The activation factor is:

$\xi = \exp\!\left(-\dfrac{E_g}{2 k_B T}\right) \qquad S = \dfrac{S_T}{1 + 5\xi}$
  • Effective Band Gap: Each system uses its own $E_g$ estimate (Default Parameters) to calculate minority-carrier activation — the smaller $E_g$ is, the lower the temperature at which bipolar effects start eating into $S$ and $zT$. This is why Bi2Te3 ($E_g=0.14$ eV) rolls over so much earlier than PbSe ($E_g=0.28$ eV).
  • Seebeck Suppression: As $T$ rises, $\xi$ grows and the $\frac{1}{1+5\xi}$ factor pulls $S$ down, reproducing the Seebeck "rollover" seen in real experiments.
  • Thermal Conductivity: The $\kappa_{bi}$ term above grows with the same $\xi$, further lowering $zT$ toward realistic limits at high T.

Default Parameters

Every constant behind the Material Systems and Physics Model sections above, for direct inspection or reproduction outside this tool. Diffusion parameters (D₀, Ea, Q*) are order-of-magnitude estimates consistent with known diffusion trends (fast interstitial dopants like Cu/Ag vs. slower substitutional ones like Cl/I) rather than independently verified literature values for each exact dopant–host pair, with the single exception noted below.

Dopant Presets

SystemDopantD₀ (m²/s)Ea (eV)Q* (eV)Default C₀ (cm⁻³)
PbSeNa2.3×10⁻⁷0.60+0.201×10¹⁹
Ag (Fast)5.0×10⁻⁷0.45+0.155×10¹⁸
Cu (Ultra-Fast)8.0×10⁻⁷0.35+0.123×10¹⁸
Cl (n-type)1.0×10⁻⁸0.80−0.102×10¹⁹
SnSeNa (p-type)1.5×10⁻⁷0.65+0.252×10¹⁹
Ag (Fast)4.0×10⁻⁷0.50+0.188×10¹⁸
K (Heavy)0.5×10⁻⁷0.75+0.301×10¹⁹
Custom1.0×10⁻⁷0.600.001×10¹⁹
MgAgSb (α)Ag (Ultra-Fast)1.2×10⁻⁶0.30+0.101×10¹⁹
Zn (p-type)2.5×10⁻⁷0.55+0.152×10¹⁸
Ni (Slow)1.0×10⁻⁸0.70+0.205×10¹⁸
Custom1.0×10⁻⁷0.500.001×10¹⁹
Bi2(Se,Te)3Cu (lit.-derived)1.7×10⁻⁶0.25+0.183×10¹⁸
Ag (est.)6.0×10⁻⁷0.30+0.155×10¹⁸
I (est.)5.0×10⁻⁹0.45−0.122×10¹⁸
Custom1.0×10⁻⁷0.500.001×10¹⁹

Only Bi2Te3:Cu is anchored to real measurements (a 2-point Arrhenius fit across 300–483 K — see Material Systems, part D). Every other row, across all four systems, is an order-of-magnitude estimate. Q* values were not independently found in literature for any of these exact dopant–host pairs; their magnitudes (0.10–0.30 eV) match the right order of magnitude for reported thermomigration heat-of-transport values but should be treated as illustrative, not authoritative.

Transport-Model Constants

Systemμ₀ (cm²/V·s)Exponent mS₃₀₀ formula (µV/K)Eg (eV)κlat(300K) (W/m·K)Seebeck slope s
PbSe11502.2400−130(log C−18)0.281.40.0025
SnSe2502.0350−100(log C−18)0.860.550.0016
MgAgSb801.5250−85(log C−19)0.180.80.0020
Bi2(Se,Te)37001.5320−100(log C−19)0.140.60.0022

$\mu(T)=\mu_0(T/300)^{-m}$; $\kappa_{lat}(T) = \kappa_{lat}(300\text{K})\times(300/T)$ for all four systems (i.e. $\propto 1/T$). SnSe additionally caps $S_T$ at 550 µV/K and adds $\kappa_{phase}=0.1\times\frac{T-750}{50}$ for $T>750$ K. Universal constants shared by all four systems: Lorenz number $L_0=2.4\times10^{-8}$ W·Ω/K², bipolar prefactor 20 (i.e. $\kappa_{bi}=20\,(T/300)\,\xi$), Boltzmann constant $k_B = 8.617333\times10^{-5}$ eV/K.

Numerical Method

The tool solves the 1D continuity equation with an explicit finite-volume scheme, offloaded to a background Web Worker so the UI never blocks while a run is in progress. Space is divided into $N$ nodes $x_i = i\Delta x$ spanning the full leg length exactly ($x_0=0$, $x_{N-1}=L$).

Discrete Update

Interior nodes update from the flux imbalance across a full cell of width $\Delta x$:

$C_i^{n+1} = C_i^{n} - \dfrac{\Delta t}{\Delta x}\big(J_{i+1/2} - J_{i-1/2}\big)$

The two boundary nodes ($i=0$ and $i=N-1$) sit exactly on the domain edge, so they only own a half cell — node 0 owns $[0,\Delta x/2]$, not $[-\Delta x/2, \Delta x/2]$, since there's no leg on the other side. With the zero-flux condition $J(0)=J(L)=0$ imposed at the true edges, that gives:

$C_0^{n+1} = C_0^{n} - \dfrac{2\Delta t}{\Delta x}\,J_{1/2} \qquad\qquad C_{N-1}^{n+1} = C_{N-1}^{n} + \dfrac{2\Delta t}{\Delta x}\,J_{N-3/2}$

The factor of 2 (rather than the interior nodes' implicit factor of 1) is what makes the scheme conserve the true integrated mass $\int_0^L C\,dx$ exactly, to floating-point precision, rather than a quantity that implicitly treats the leg as one grid spacing longer than entered. This was verified by direct calculation: without the factor of 2, the boundary cells behave as if they were full-width, so the total simulated mass drifts by $\mathcal{O}(1/N)$ — about 1–2% at the default 70-point grid, rising to about 10% at the coarsest 10-point floor. With it, ∫C dx is conserved exactly regardless of grid resolution or how strong the Soret term is.

Upwind Advection

Each face flux $J_{i+1/2}$ combines a centered Fickian term with an upwinded Soret (advective) term — the concentration used for the advective part comes from whichever side the local drift is flowing from, not a simple average of both sides:

$J_{i+1/2} = \underbrace{-D_{avg}\dfrac{C_{i+1}-C_i}{\Delta x}}_{\text{Fickian, centered}} \; + \; \underbrace{v_{i+1/2}\,C_{upwind}}_{\text{Soret, upwinded}}, \qquad v_{i+1/2} = -D_{avg}\left(\dfrac{Q^*}{k_BT^2}\dfrac{\partial T}{\partial x}\right)_{avg}$

$C_{upwind}=C_i$ if $v_{i+1/2}\ge0$ (drift toward $+x$), else $C_{i+1}$. A centered average for the Soret term is only oscillation-free while the local cell Péclet number $\big(\frac{Q^*}{k_BT^2}\frac{\partial T}{\partial x}\big)\Delta x$ stays below ≈2; grid coarsening (below) enlarges $\Delta x$ exactly when that number is already large from a big $Q^*$ or steep gradient, so a centered scheme can and did produce negative concentrations in that regime. Upwinding trades a bit of numerical smearing for guaranteed monotonicity. A $\max(0,\cdot)$ floor is also applied to every update as a belt-and-suspenders backstop.

Adaptive Grid & Stability

  • Adaptive grid: The spatial grid starts at $N=70$ points and is coarsened in steps of 5 (down to a floor of $N=10$) if the step budget (4,000,000 steps) would otherwise be exceeded — this keeps very fast dopants tractable without changing the physics. If the budget still can't cover the full requested anneal duration even at the coarsest grid, the run is truncated and a banner (plus a note in the CSV export) says so along with how much simulated time you actually got — it is never left unstated.
  • CFL stability: The time step obeys both a diffusive and an advective limit, and the smaller of the two is used: $\Delta t = \min(\Delta t_{diff}, \Delta t_{adv})$, with
    $\Delta t_{diff} = 0.4\,\dfrac{\Delta x^2}{D_{max}} \qquad \Delta t_{adv} = 0.25\,\dfrac{\Delta x}{v_{max}}$
    The marginal (exactly-stable) limits are $\Delta x^2/(2D)$ and $\Delta x/(2v)$ respectively — both figures above already include the boundary nodes' tighter half-cell requirement, so the 0.4 and 0.25 factors are true safety margins (not just margins for the interior nodes), not marginal values themselves.
  • Snapshot sampling: Roughly 40 evenly spaced snapshots are stored across the run for the 3D Timeline view and CSV export; the 2D Final view compares only the first (t=0) and last snapshot.
  • Boundary conditions: Both ends of the leg are closed (zero-flux, $J=0$) — dopant mass is neither absorbed nor emitted at the contacts, and (per the half-cell treatment above) the true integrated mass is conserved exactly, not approximately.

Limits & Validation Rules

Every hard bound the tool enforces, and why. Bounds on T_Hot, T_Cold, and Leg Length are enforced by clamping the input field itself (you'll see the number in the box change); the gradient cap is enforced by refusing to run and explaining why, never by silently changing a number you typed — the same is true of the Smart Input concentration formula (invalid syntax blocks the run with an inline error rather than falling back to something else).

QuantityEnforced limitReason
T_Hot & T_Cold300 K floor; ceiling is material-specific (see Material Systems: 1300/1100/560/800 K for PbSe/SnSe/MgAgSb/Bi2Te3)Stay below melting (or, for MgAgSb, below the α-phase transition) with a safety margin; stay at/above room temperature
|T_Hot−T_Cold| / Leg Length≤ 40 K/mmKeeps the linear profile physically reasonable and keeps the local cell Péclet number in check (see Numerical Method)
Leg Length≥ 2 mm, no upper boundAvoids degenerately short legs; combined with the gradient cap this also bounds how steep a profile is reachable at all
Anneal Duration0.01–365 daysUI-level sanity bound
Initial concentrationFloored at 1×1015 cm⁻³ at t=0 (Smart Input formula or constant)Avoids a zero/negative seed profile
Concentration, for property evaluationClamped to 1×1017–5×1020 cm⁻³ only when computing S/σ/zT at a pointKeeps the mobility/Seebeck fits inside their valid range; the underlying simulated concentration field itself is not clamped to this window, so the chart/CSV can still show values outside it
Grid points NStarts at 70, auto-coarsens by 5 down to a floor of 10Keeps runtime/step-count bounded for fast dopants
Step budget4,000,000 steps per runIf still exceeded at N=10, the run is truncated — flagged via banner and CSV note, never silent
D₀, Q* (both custom and preset)No hard boundKnown gap — extreme values are handled correctly by the upwind scheme, non-negativity floor, and step-budget/truncation logic, but can still make a run slow to converge or heavily grid-coarsened. Sanity-check unusually large entries against Default Parameters.

Modeling Assumptions

  • Purely 1D along the leg axis — no radial or cross-sectional variation.
  • The temperature profile is fixed and linear for the entire anneal (no transient thermal solve, no coupling from doping back to $T$).
  • Complete ionization: simulated dopant concentration $C$ is used directly as free-carrier concentration, with no separate ionization-fraction or trap-state treatment.
  • No contact resistance, interfacial reactions, or mechanical/stress-driven transport.
  • The bipolar correction is a calibrated approximation tuned to typical TE data, not a full band-structure calculation.
  • D₀/Ea/Q* presets are order-of-magnitude estimates, consistent with known diffusion trends (fast interstitial dopants like Cu/Ag vs. slower substitutional ones), rather than independently verified literature values for each exact dopant–host pair — except Bi2Te3:Cu, whose D₀/Ea come from a 2-point Arrhenius fit to two literature diffusion measurements (300 K and 483 K, different sample types). See Default Parameters for the complete table.

Units & Symbols

Quantity Symbol Unit
TemperatureTK
Dopant / carrier concentrationCcm⁻³
Dopant fluxJcm⁻²s⁻¹
Diffusivity / diffusion prefactorD / D₀m²/s
Activation energyEaeV
Heat of transportQ*eV
Leg lengthLmm
Anneal durationtdays
Seebeck coefficientSµV/K
Electrical conductivityσS/cm
Carrier mobility / prefactorμ / μ₀cm²/V·s
Mobility temperature exponentm(dimensionless)
Band gapEgeV
Bipolar activation factorξ(dimensionless)
Thermal conductivity (lat./elec./bipolar/phase/total)κlat,elec,bi,phase,totW/m·K
Lorenz numberL₀W·Ω/K²
Figure of meritzT(dimensionless)
Boltzmann constantkB8.617333×10⁻⁵ eV/K

FAQ & Troubleshooting

I get an "Invalid Formula" error on the Concentration field — why?

The expression must be valid JavaScript math using only x and the functions listed under Smart Input. A common cause is missing multiplication signs — write 2*x, not 2x.

Why does the plot look coarser for very fast dopants like Cu or Ag?

Very high diffusivities or Soret velocities force a smaller stable time step. To stay within the step budget, the solver automatically coarsens the spatial grid — see Numerical Method above.

What exactly is in the exported CSV?

Two blocks — concentration and ZT — each with time (seconds) down the rows and position (mm) across the columns, covering every sampled snapshot of the most recently completed run.

Does the model include contact resistance or radiative heat loss?

No — see Modeling Assumptions (under Limits & Validation Rules) above. The thermal profile is treated as fixed and linear, and both ends of the leg are zero-flux boundaries for dopant transport — total dopant mass is conserved exactly (see Numerical Method).

I'm getting a "Gradient exceeds limit" error and the run won't start — why?

|T_Hot−T_Cold| / Leg Length is capped at 40 K/mm to keep the profile physically reasonable. The error message tells you the max ΔT for your current leg length, and the min leg length for your current ΔT — adjust either one.

An amber banner says my run was truncated — is my result still usable?

The physics up to the reported "actual" time is still valid — the run just didn't reach your full requested duration before hitting the 4,000,000-step budget. Try a shorter anneal duration, a smaller |Q*|, or a milder gradient to let it finish.