Heat treatment and phase simulation
Run a temperature-time cycle on a steel grade and get phase fractions, dilatation and predicted hardness back.
You have a thermal cycle in mind — austenitize at 900 °C, hold, quench — and you want to know what microstructure and what hardness come out the other end. Normally that means a dilatometer, a Gleeble, or a hardness traverse on a sectioned coupon. The heat treatment simulator answers the same question numerically: give it a grade and a temperature-versus-time schedule, and it integrates the phase transformation kinetics step by step and reports what forms and how hard it ends up.
It is the right tool when you already know the thermal path and want the outcome. If instead you want to know which cooling rates produce which structures — the map rather than one point on it — use CCT diagram generation. If you want the dilatometry signal a physical Gleeble would record, or a thermomechanical test, use Virtual Gleeble.
What it models#
The simulator solves phase transformation kinetics at a single material point. There are no spatial gradients: no through-thickness temperature profile, no surface-to-core variation. Every point of your specimen is assumed to follow the temperature history you supplied.
Five phases are tracked, in this order: Ferrite, Pearlite, Bainite, Martensite, Austenite. Ferrite, pearlite and bainite are computed from a Kirkaldy-Venugopalan rate equation; martensite uses the athermal Koistinen-Marburger equation with a coefficient of 0.013. The same kinetics engine sits underneath all four simulators in Phases.
A worked example#
Type this into the chat, with nothing loaded beforehand:
Run a heat treatment on DC04: heat to 900 °C, hold 5 seconds, then cool to room temperature.
Because you named a grade and named the simulation, the agent has everything it needs. It replies with a Heat Treatment Configuration card showing the Material, a Time Step field, a read-only summary of your curve written as <time>s → <temperature>°C pairs, and any composition overrides. Nothing runs until you press Run Simulation. That confirmation step is deliberate — the card is where you check that the schedule the agent understood is the schedule you meant.
Press it, and the run executes. Progress messages appear as the solver works ("Running phase solver...", "Generating plots...", "Uploading results..."), then you get a written summary plus a gallery of plots. The run is stored as the next version in your session — run_001, run_002, and so on. See sessions, runs and artifacts for how to get back to it later.
If you have no material loaded and you ask for "a heat treatment" without naming a grade, nothing runs. You get asked which material first. There is no default grade in this product — see the material catalog.
What you can control#
| Parameter | Meaning | Units | Default | Range |
|---|---|---|---|---|
| Material | The grade or workspace material | — | none — always required | any catalog grade, workspace material, or confirmed custom chemistry |
| Temperature curve | The time-temperature schedule | s, °C | 0 s / 860 °C, 5 s / 860 °C, 10 s / 20 °C on the chat card | at least 2 points; see the Celsius caveat below |
| Time step | Integration step size | s | 200 steps across the run when you do not ask for one | clamped to 0.01–30 s; the chat card accepts 0.1–0.5 s |
| Initial phase fractions | The starting microstructure | fraction 0–1 | determined automatically | five physical phases, each in 0–1, summing to 1.0 within 0.05 |
| Composition override | Chemistry changes on top of the base grade | wt % | the grade's own chemistry | the 20 card elements; total must be 100 %, with Fe balanced for you |
The resulting step count is round(total time / time step), clamped to between 50 and 10 000 steps. Every run reports back its sim_config: the simulated time, the number of steps, the effective step size, and the step size you requested.
The 20 recognized element keys are C, Mn, Si, Ni, Cr, Mo, Cu, S, P, Al, As, W, V, Ti, Bo, Nb, N, O, Fe, Zr. Anything else is rejected with Unknown element. Changing chemistry goes through the confirmation gate described in your own chemistry before it can be simulated.
Describing a schedule#
You do not need to write coordinates. Describe the cycle the way you would to a colleague and the agent turns it into curve points, which you then check on the card:
Run a heat treatment on EN13261: heat from room temperature to 900 °C over 2 seconds, hold for 5 seconds, then cool to 20 °C by 50 seconds.
Temper this steel at 600 °C for 30 seconds, starting from 100% martensite.
Run a heat treatment on DP600 holding at 860 °C for 5 seconds, then cooling to 20 °C by 10 seconds. Use a time step of 0.1 seconds so the curves are smooth.
Two things to keep in mind.
Time is in seconds, always. A "one hour hold" is 3600 s, and it will cost you steps — the step count is capped, so a very long cycle at a fine step size will silently coarsen.
Keep peak temperatures at or below 1000 °C. Curve temperatures are auto-detected by magnitude: if the highest temperature in your curve is 1000 or below, the values are read as Celsius; above 1000 they are read as already being Kelvin. A peak you write as 1100 meaning 1100 °C is interpreted as 1100 K, which is about 827 °C. This is the single most common way to get a quietly wrong answer out of this simulator.
The cooling segment is what sets the microstructure. 860 °C → 20 °C over 5 s is roughly 168 °C/s; the same drop over 40 s is roughly 21 °C/s. Note that Phases will not call a numeric rate "water quench" or "air cool" unless you supply that mapping yourself — the solver models a temperature history, not a quench medium.
Reading the results#
Plots come back as a gallery in the chat. These are the four the standard run produces, under their gallery labels:
Phase Fractions — the five phase fractions against time on a 0 to 1.05 left axis, with temperature overlaid on a right axis in Kelvin. Legend entries read Ferrite (x1), Pearlite (x2), Bainite (x3), Martensite (x4), Austenite (x5), plus Temperature. This is the plot to read first: it shows when austenite formed, when it decomposed, and into what.
Dilatation vs Time — time on X, temperature (K) on the left axis, dilatation on the right. Dilatation here is the sum of two contributions: a phase-weighted thermal term, using per-phase expansion coefficients (ferrite, pearlite and bainite 12.0 × 10⁻⁶ /K, martensite 10.5 × 10⁻⁶ /K, austenite 18.0 × 10⁻⁶ /K), plus the transformation dilatation increment returned by the solver at each step. The deviation from a straight thermal line is the transformation signal — the same feature you would identify on a real dilatometer trace to pick off transformation start and finish temperatures.
Dilatation vs Temperature — the same dilatation signal with temperature (K) on X. This is the axis pairing a dilatometry trace is normally read on. Ask for it by name (Plot dilatation vs temperature) and you get this figure rather than the time-based one.
Hardness (HV30) — Vickers hardness against time. Hardness is computed at every step from the current phase mixture using Kasuya-Yurioka, Krauss and Maynier relations — one for ferrite plus pearlite, one for bainite and one for martensite, with the bainite and martensite relations switching at 0.12 % C — combined as a fraction-weighted mixture. Read it as a bulk, rule-of-mixtures hardness for the whole mixture, never as the intrinsic hardness of one constituent. See hardness validation for how far to trust the number on your grade.
Ask for a specific plot and you get that plot:
Show me the dilatation curve from that run.
The numeric data is stored alongside the images. Time_phase.txt carries time, temperature in Kelvin, then the phase columns; Time_statevars.txt carries time and hardness; Time_dilatation.txt carries time and dilatation; PhaseLog.txt records the step count, wall time and final hardness in a single line. The material card actually simulated is stored too, as mat_Steel.k and material_resolved.k, with a material_resolution.json recording how the material was resolved. Everything is also zipped as outputs.zip.
To come back to a run later:
List my runs.
Inspect run 3 and show me its plots.
Inspecting a run returns its metadata and signed plot links. It does not hand back the contents of the numeric text files, so do not expect a column of hardness values to appear in the chat because you asked to inspect a run.
Initial phases (PHC)#
Every run has to start from some microstructure. In Phases this is called the initial phase composition, or PHC, and it covers the five physical phases.
Most of the time you never touch it. When you supply a curve but no explicit starting phases, the simulator reads the material card's equilibrium curves at your curve's first temperature. If that temperature is at or above Ac1 (the lowest temperature at which the card's equilibrium austenite fraction is above zero), it interpolates the equilibrium fractions there and normalizes them to sum to 1.0. Bainite and martensite are always set to zero in that case — they carry negative sentinel values in the card because they are non-equilibrium phases that only form on cooling. If your start temperature is below Ac1, equilibrium says nothing useful about a history-dependent microstructure, so the card's authored room-temperature values are used instead.
You will meet PHC directly in two situations. The first is tempering or any cycle whose starting structure is the point of the experiment — a tempering run only means something if you start it from martensite. The second is when you want to isolate the decomposition of a fully austenitic structure without simulating the soak that produced it.
Both are expressed in plain language:
Set the initial phases on my active material to 100% austenite.
The rules are simple. Each value must be between 0 and 1, all five physical phases participate, and they must sum to 1.0 within 0.05 — otherwise you get Sum of physical phases must be ~1. In the simulation panel's configure tab the tolerance is tighter, 0.01, and the run button stays disabled until the fractions balance.
An imposed starting state is an input, not a result. If you start a run at 100 % austenite, that is not evidence that austenitization completed under your cycle — it is an assumption you made. Phases is explicit about that distinction and will not present one as the other.
Limits#
- No default material. A heat treatment request without a grade, a workspace material, an active session material, or a chemistry returns
Please choose a material before running a simulation.and nothing executes. - Single material point. No spatial gradients, no section size, no quench severity, no surface-versus-core.
- Celsius is inferred from magnitude. Peaks above 1000 are read as Kelvin. Keep example peaks at or below 1000 °C.
- The material must resolve two capabilities before a run version is allocated: a base card and transformation kinetics. If either cannot be resolved the run fails with
Required material physics is unavailable for HT. Where a custom chemistry has no published kinetics model, the verified template's authored kinetics are reused and reported as apreserved_sourcefallback with a warning — that is a fallback, not a calibration claim for your chemistry. See the capability matrix. - Custom chemistry needs a verified template. Without one the run is refused:
This custom material has no active verified template. Reload the material or select its structural template before running HT. - The stress-strain figure is not produced by current runs. It exists in the product's plot vocabulary, but the heat treatment path writes no strain-stress data, so no such plot appears in the gallery.
- The exact artifact set depends on how your workspace executes runs. Some deployments run heat treatment through a background worker that publishes a phase plot, a hardness plot, a results summary and a CSV instead of the text files above. The physics is the same; the file names differ.
- Confirming a chemistry is not calibrating it. Confirmation stores a stable definition and a compatible base card; it computes no kinetics and no flow stress.
- Workspace viewers cannot run simulations. You need member or admin access in the workspace — see workspaces and roles.
- One request runs one simulator. Asking for a heat treatment will not also produce a CCT diagram, and loading or editing a material never triggers a run on its own.
Broader model limitations — where the kinetics over-predict martensite, where hardness runs high, which critical temperatures are grade-independent — are collected in known limits. If a run refuses or a result looks wrong, common problems lists the messages you are most likely to meet and what each one means.
Where to go next#
- Your first simulation for the end-to-end walkthrough
- How the conversation works for why the agent asks before it runs
- Compare two grades for running the same cycle on two steels
- Parameter blocks for the configuration card format
- Glossary for the vocabulary used above
