Sign in ↗

Documentation

CCT and TTT diagrams

How Phases builds a continuous-cooling transformation diagram, how to read its curves and reference lines, and what you can and cannot control.

You have a grade and a process, and you need to know where the transformation boundaries sit: how slowly you can cool before ferrite appears, how fast you have to cool to reach full martensite, and roughly what hardness each of those choices lands on. That is the question a CCT diagram answers, and it is what run_transformation_diagram produces in Phases.

The diagram is not looked up from a handbook. Phases runs a separate phase-transformation simulation at every cooling rate you ask for, detects where each phase starts and stops changing, and assembles those points into one chart.

A worked example#

Name the material and ask:

Generate a CCT diagram for DP600 and find the critical cooling rate for full martensite.

If you want to control the sweep, say so in the same message:

Generate a CCT diagram for EN13261 from 860 °C to 20 °C at 0.1, 1, 10, 50 and 100 °C/s

When you specify parameters, the agent normally shows a CCT Diagram Configuration card first — a material picker, a comma-separated Rates (°C/s) field, Start Temp (°C) and Final Temp (°C), and a Generate CCT Diagram button. Nothing runs until you submit it. There is no default grade: asking for "a CCT diagram" with no material gets you a question back, not a run.

Every workspace currently routes CCT to background execution, so the tool answers immediately with CCT simulation accepted for durable execution. and the sweep continues on the server. You get a workflow status card that survives a reload rather than a live commentary; see long-running simulations.

On a deployment still running CCT in-request, you instead see one progress line per rate — CCT rate 2/5: 1 C/s, then CCT rate 2/5 finished: 1 C/s, 515 HV30 once that rate has solved (the hardness is appended only when the solver returned one) — followed by Aggregating CCT results..., Uploading CCT diagram..., and CCT diagram ready for 5/5 rates.

Reading the diagram#

This is where most misreadings happen, so read this section before you read your first plot.

Two renderers draw the PNG. The background worker draws a legend down the side of the chart and no annotation boxes; the in-request renderer draws small text labels at each marker and two annotation boxes instead. Both use the same axes, the same start/finish geometry, and the same helper for the reference lines, so the physics on the two charts is identical even though the furniture differs.

  • Axes. Time in seconds on a logarithmic x-axis, temperature in °C on the y-axis. The log axis is why a 0.1 °C/s curve and a 100 °C/s curve fit on one chart, and why the visual spacing between rates is not proportional to time.
  • Grey lines are the cooling schedules themselves, each annotated at its end with its rate, for example 10 °C/s. They are straight linear ramps from your start temperature to your final temperature — no soak, no heating segment.
  • Dashed lines with downward triangles are transformation starts. The in-request renderer labels each marker with the phase initial plus s: Fs, Ps, Bs, Ms. The background renderer names them in the legend instead: Ferrite start, Pearlite start, and so on.
  • Solid lines with upward triangles are transformation finishes, labelled with the phase initial plus e: Fe, Pe, Be, Me, Ae — or Ferrite end, Pearlite end and so on in the legend. The in-request renderer deliberately omits austenite start points, since the run begins fully austenitic; the background renderer draws an Austenite start series, which is the imposed initial condition finding its first change, not a measured austenitisation.
  • Dotted horizontal lines are four rate-independent reference temperatures read off the resolved material card. Each is labelled outside the right edge of the axes with its source and its value on the next line: Ae3 (Fer Tcrit), Ae1 (Pea Tcrit), Bs (Bai Tcrit), Ms (Mar Tcrit) and e.g. 740 °C. Bs and Ms take the colour of their own transformation curve; the two Ae lines are neutral grey. A line is omitted when the card has no value for it, or when the value falls outside the plotted temperature range — the axis is never widened to make room for one.
  • Colours are fixed per phase within one chart, but the two renderers do not use identical palettes. Ferrite is blue, bainite orange and martensite red in both; pearlite and austenite differ. Read the marker labels or the legend, not the colour.
  • Upper-right box (in-request renderer only): predicted hardness per cooling rate, one monospaced line per rate in the form <rate> °C/s = <value> HV. It only appears when the solver returned hardness values for those rates.
  • Lower-left box (in-request renderer only): the material label, its chemistry laid out four elements per row, and a Final phases (%): section giving the ferrite/pearlite/bainite/martensite/austenite split at the end of each cooling curve. When the card does not define one of the reference temperatures, the box ends with a line such as No card value for: Ae3, Bs naming exactly the ones that could not be drawn. That line means the card lacks the value; it does not mean the plot failed.

Three labels that are not the same thing#

A CCT diagram exists to prevent confident misreadings, and the labelling on this one is deliberately verbose for that reason. Ae, Bs and Ms each appear in more than one role:

What you seeWhere it isWhat it means
Bs, Ms at a marker, in the phase colouron the marker chainbainite or martensite start at that one cooling rate
Bs (Bai Tcrit), Ms (Mar Tcrit) in the right marginat a dotted horizontal linethe card's rate-independent critical temperature for that phase
Ae3 (Fer Tcrit), Ae1 (Pea Tcrit) in the marginat a dotted horizontal linethe card's ferrite and pearlite critical temperatures, not equilibrium lines
Ae at a markeron a finish chain, in austenite colouraustenite finish — the phase initial A plus e. Unrelated to Ae1/Ae3

No Ac1 or Ac3 heating critical temperatures are drawn. Phases does not simulate your austenitisation, so nothing on the chart describes heating.

A word about the "nose". The classic C-curve nose is the shortest time at which a diffusional transformation begins; on this plot you infer it from where the Fs/Ps/Bs marker chains bend leftmost. Because Phases only plots the rates you asked for, the nose is resolved exactly as finely as your rate list — a five-rate sweep gives you five points per curve, not a smooth envelope. It is a chain of per-rate markers, not a fitted curve.

Start and finish are detected numerically, not by eye. A start is the first timeline point where a phase fraction has moved more than one percentage point from its initial value; a finish is the earliest point after which the fraction stops changing to within a very tight tolerance — a plateau, not a fixed 99% threshold.

What you control#

ParameterDefaultNotes
MaterialnoneMandatory. A built-in grade, a workspace material, an active session material, or a confirmed custom chemistry.
Cooling rates (°C/s)0.1, 1, 10, 50, 100Must be positive. The card and the simulator panel accept at most 10; a background run allows at most 64 and is also capped by a step budget — see below.
Start temperature860 °CCard and panel accept 600–1200 °C.
Final temperature20 °CCard and panel accept 0–500 °C. Must be below the start temperature.
Initial phase fractions100% austeniteOverridable, but see the limit below.

There is no adaptive rate selection. Phases runs exactly the rates you supply, in the order you supply them — one simulation per rate. It does not add extra rates around a transformation nose, and it does not refine a bracket for you. If you want the nose resolved, you add the rates yourself; that iterative narrowing is exactly what find the critical cooling rate walks through.

A background sweep has a work budget, and it is checked before anything runs. At most 64 cooling rates, and at most 50,000 integration steps estimated across the whole sweep. Because the step is clamped at 10 s, slow rates are expensive: over the default 860 → 20 °C span every rate from 0.1 to 10 °C/s costs about 840 steps, so roughly 59 of them fit, while a single 0.001 °C/s rate estimates 84,000 steps and is refused on its own. An over-budget submission is rejected outright rather than partially run — but what you see in chat is the generic CCT durable execution could not be accepted. Please retry., so if a wide slow-cooling sweep never starts, cut the rate count or drop the slowest rates instead of retrying. MCP callers meet this limit first, because they have no configuration card capping them at 10 rates.

What is automatic is the integration time step. For each rate the workflow picks roughly one step per degree of cooling — max(0.1, min(10.0, 1.0 / rate)) seconds, so 1 s at 1 °C/s, clamped to 0.1 s above 10 °C/s and to 10 s below 0.1 °C/s. You cannot set it from chat: the transformation-diagram tool has no time-step parameter.

The Advanced simulator panel does show an optional Time Step (s) field, placeholder auto, minimum 0.01. It is not forwarded to the CCT workflow. The Configure tab puts the value into the submitted JSON, but the submission prompt extracts only rates, start temperature, final temperature and material, and neither run_transformation_diagram nor the CCT input carries a time step. Whatever you type there is dropped without a warning and the automatic per-rate step is used anyway. Leave it on auto.

CCT versus TTT#

The transformation-diagram tool does not do TTT. run_transformation_diagram(mode='ttt') returns an explicit unsupported status with the message "TTT transformation diagrams are not implemented yet." Only continuous cooling is simulated there.

Calculated isothermal TTT curves are available outside chat, in the material catalog. Open a grade in your workspace and use the Composition transformation analysis (TTT) panel, or switch a family view to TTT band or TTT heatmap. Those are MatLibrary-style curves derived from the material card's own kinetics parameters — 5% start and 95% finish branches for ferrite, pearlite, bainite and martensite, over a time and temperature grid. They are a calculation from the card, not a simulated isothermal hold, and generating one needs the member or admin role in that workspace.

For an actual simulated isothermal hold — a real timeline with phase fractions evolving at a fixed temperature — run a V-Gleeble isothermal test with hold_temp_c and hold_time; see virtual Gleeble.

There is also a second thing people mean by "CCT". A CCT diagram is a predicted phase-boundary map. A Gleeble CCT dilatometry test is a simulated measurement — the length-change signal a physical dilatometer would record for one cooling cycle. Those are different tools. If your wording is ambiguous, the agent asks which one you want.

What you get back#

The sweep produces one run version regardless of how many rates it contains. A background run stores five artifacts:

  • plots/cct-diagram.png — the diagram,
  • results/cct-data.csv — the detected boundaries, one row per phase per cooling rate, with the columns cooling_rate, phase, start_time, start_temp, end_time, end_temp,
  • results/summary.json — the machine-readable cct-results/v2 document: material_name, start_temp_c, final_temp_c, rates, and one rate_summaries entry per rate carrying rate, hardness_hv, total_steps, wall_time_s and final_phases. This is the file the per-rate result card reads, and the one to download if you want the numbers as data rather than as a picture,
  • mat_Steel.k — the exact material card used for every rate,
  • material_resolution.json — a record of how that card was chosen.

An in-request run stores four of those, at the older paths run_XXX/CCT/cct_diagram.png, run_XXX/CCT/cct_data.csv, run_XXX/mat_Steel.k and run_XXX/material_resolution.json. There is no summary.json on that path.

They are written as one bundle. On an in-request run, if any of them fails to persist the tool reports an artifact-persistence error and records the run as artifact_persistence_failed; a background run validates the sweep and then publishes its artifacts together, failing the workflow rather than completing it if that publish does not finish. Either way, a partial diagram is never reported as a completed run. The diagram appears in the conversation; the CSV and summary.json are stored rather than linked in chat, so retrieve them from the run's artifacts — see sessions, runs and artifacts.

For a newly completed durable run, the strict cct-results/v2 result card also retains and displays each successful tested rate with its predicted hardness and final ferrite, pearlite, bainite, martensite and austenite fractions. Its hardenability indicator is the lowest tested rate with at least 90% final martensite. On the same tested grid and 90% criterion, a lower threshold rate means the material retained at least 90% martensite under slower cooling and therefore indicates greater hardenability. This is a sampled threshold, not an interpolated critical cooling rate or an opaque ranking. Use the same rate grid, thermal endpoints and initial condition before comparing materials. Historical sparse cct-results/v1 results remain valid and replay with their rate-coverage view; v1 never contains the v2 per-rate fields.

If a single rate fails, the sweep continues and that rate carries an error instead of a hardness value. Only a sweep where every rate failed aborts.

Using it to choose a quench#

Read the per-rate result rows or the final-phase box, not the curves, when you are choosing a process. They tell you directly what fraction of martensite each rate produced, and the hardness values tell you what bulk hardness that mixture implies. Bracket from there: if 10 °C/s gives you 60% martensite and 50 °C/s gives you 100%, re-run with rates between them.

Three cautions when you translate that into shop-floor language:

  • For mild, HSLA and DP grades that bracket sits in an unvalidated band. The 10–100 °C/s range is exactly where those grades' predicted hardenability is known to be wrong; read the limit below before you act on a martensite fraction taken from it.
  • A cooling rate is not a quench medium. Phases models a numerical rate, not water, oil, or air. It does not know your section thickness, agitation, or heat-transfer coefficient, and it will not label a rate as a particular quenchant unless you supply that mapping yourself.
  • Predicted hardness is bulk, mixture hardness — a rule-of-mixtures value over the phase fractions. It is not the hardness of any individual phase, and it is not a toughness, quench-cracking, or preheat prediction. Phases will not make those claims from composition and phase fractions alone.

Limits worth knowing#

  • The austenitic start is imposed, not simulated. Every rate begins from a forced 100% austenite state. Phases does not simulate your heating and soak, does not calculate this material's Ac3, and does not verify that your start temperature is above it. A completed run is never evidence that austenitization would have completed in reality.
  • Critical-temperature lines are card predictions, not measurements. Ae3, Ae1, Bs and Ms are evaluated from the exact material card's phase-specific base and composition-coefficient row, so they vary by grade and by an applied chemistry override. They are kinetic card inputs and have not been independently calibrated as measured equilibrium temperatures for every grade. The margin labels say (Fer Tcrit), (Pea Tcrit), (Bai Tcrit), (Mar Tcrit) precisely so they cannot be read as equilibrium-diagram values.
  • The card warns before it runs when your chemistry is out of the fitted range. If the active material's transformation kinetics resolve as out-of-domain, the CCT Diagram Configuration card shows Outside the kinetics model's fitted range — that material's chemistry sits outside the composition range the transformation-kinetics model was fitted for, and the phase fractions and hardness the run reports are not validated there. The specific resolver warnings are listed underneath, and the same banner appears on the Advanced panel's Configure tab. It is a warning, not a refusal: the sweep will still run. Treat any diagram produced under that banner as unvalidated for your grade.
  • Hardenability is over-predicted for mild, HSLA and DP grades, inside this simulator's own rate band. DC04 cooled from 900 °C at 20 °C/s returns 1.9% ferrite, 98.1% martensite and 277 HV, where a 0.08% C mild steel should be over 90% ferrite + pearlite at roughly 110–125 HV; 50 °C/s behaves the same way. Both cases are pinned as strict expected failures in the backend test suite, so the gap cannot close quietly. The cause is shared kinetics constants rather than a solver fault: fourteen mild/HSLA/DP catalog decks and the simulator-only EN13261 deck carry one identical constant set, so every one of them inherits a single critical cooling rate of roughly 10–20 °C/s. Do not take a phase fraction or a hardness from the 10–100 °C/s band for those grades — that band was never validated. The same over-prediction appears in weld-HAZ cooling for DC04 and HC260LA. See known limits.
  • A material must resolve two capabilities — a base card and transformation kinetics — before the sweep starts. If either is unavailable the run fails with "Required material physics is unavailable for CCT", followed by the specific resolver warnings. Which materials resolve which capabilities is set out in the capability matrix.
  • Custom chemistry needs a verified template. A composition with no active verified structural template is refused. Where no published kinetics model applies to your chemistry, CCT falls back to the template card's authored kinetics and reports it as a preserved source; that is a documented fallback, not calibrated physics for your composition. See your own chemistry.
  • A queued run is not a finished run. Because every workspace routes CCT to background execution, the first thing you get back is an acceptance, not a result. No phase fractions or conclusions exist until the workflow completes.

The hardness model behind the boxes on the plot is validated against published literature ranges — for example 22MnB5 at 100 °C/s predicts 515 HV against a literature band of 440–530. Read how we validate and known limits before you use a number in a specification. If a sweep is refused or a diagram does not look like you expected, common problems covers the usual causes.