Documentation
Resistance spot welding
How to run a coupled electromagnetic-thermal spot weld in Phases, what the confirmation card controls, and which steel grades are supported.
You have a sheet stack and a weld schedule, and you want to know what the nugget does before you tie up a welding cell. Phases runs a real 2D axisymmetric finite element model of the joint: you give it two plate grades, thicknesses, coating state, current and electrode pressure, and it returns the temperature field, the nugget and heat-affected-zone geometry, and an animation of nugget growth.
What the solver actually models#
The solver is a staggered multiphysics loop. Inside one macro timestep the order is electromagnetic, then thermal, then microstructure, then mechanical. That order is load-bearing rather than incidental: the microstructure block hands its freshly updated phase fractions straight to the mechanical solver's constitutive model in the same step, and the mechanical solve returns the contact pressure that the next step's electromagnetic solve uses.
The four stages do not run at the same rate. Only the transient thermal problem (Crank-Nicolson, with temperature-dependent conductivity and specific heat; density is a constant per material) advances on every step. The electromagnetic problem — a scalar-potential Laplace solve giving Joule heating — is re-solved every 20 steps, and only while the current is on. Its switch-off time is your weld time, and after it the Joule and contact heat sources are zeroed and the electromagnetic problem is not solved at all — for a 3.0 s total time with a 0.42 s weld, that is 2.58 s of the run. Mechanics and microstructure are each sub-cycled every 10 steps, and a microstructure update is additionally skipped when the largest tracked temperature change since the last update is below 0.5 K.
Contact resistance is modeled at three interfaces — electrode-to-top-sheet, electrode-to-bottom-sheet, and the faying sheet-to-sheet surface — as a pressure- and temperature-dependent Jonny-Kaars model, with a zinc enhancement at the faying surface that starts softening around 400 K and passes zinc melting at 693 K. Electrode ends are water-cooled by a forced-convection boundary condition; outer surfaces lose heat by free air convection and radiation. Coating temperature is capped at 1180 K (zinc boiling point) and steel at 3134 K. Time stepping is adaptive after the current is switched off, so the long cooling tail is cheap.
Two things this is not. The mechanical option is an experimental linear thermoelastic and contact solve — not an elastoplastic one — so its displacement and stress output must not be read as electrode indentation, sheet thinning or expulsion.
And the geometry is far more fixed than the parameter list suggests. The mesh transform reads exactly two inputs per plate: coating state and thickness. It strips coating elements, closes the resulting gaps, scales sheet thickness, and then translates the electrodes to meet the new outer surfaces. The electrode tip shape and electrode mesh never change. Grade changes properties, not geometry. Squeeze time, hold time, electrode tip shape and multi-pulse schedules are not exposed at all. See Known limits.
Running one#
Type what you want:
Spot-weld two 1.5 mm DP600 sheets at 8 kA and show the nugget growth.
Phases will not run this straight away, and that is deliberate.
The confirmation card is mandatory#
Every spot-welding request produces a Configure simulation card before anything executes, even when you already stated every parameter — your numbers are pre-filled into the card, but the card still appears. Nothing runs until you press Run Simulation. The button then reads Submitted and a green ✓ Submitted badge appears in the card header. All four simulators gate execution behind a card; RSW is the only one whose card is mandatory, shown even when there is nothing left for you to fill in. See How the conversation works.
The card is not the only RSW surface. Its Advanced button opens the same configuration in the Simulator tab, which exposes three things the card does not: the timestep, the template dropdown and a waveform editor. The last column below says where each field lives.
| Field | Parameter | Unit | Default | Range enforced | Where |
|---|---|---|---|---|---|
| Top Plate material | steel_grade_top | grade name | DC04 | one of the 20 supported grades | both |
| Bottom Plate material | steel_grade_bottom | grade name | DC04 | one of the 20 supported grades | both |
| Thickness (per plate) | thickness_top / thickness_bottom | mm | 1.0 | 0.3–5.0 | both |
| Coating switch (per plate) | coating_top / coating_bottom | on/off | on | — | both |
| EM Control switch | em_bc_type | current or voltage | current | — | both |
| Current | current_kA | A in the field, kA in the payload | 7.0 kA | 1000–12000 A | both |
| Solver potential (voltage mode) | voltage | mV | 1062.2 (1.0622 V) | 1–100,000 | both |
| Mechanical — Pressure | force_pressure | MPa | 23.33 | 1–200 | both |
| Mechanical — Force | force_kN | kN | — | 0.5–15 | both |
| Weld Time / EM switch-off | weld_time | s | 0.42 | 0.01–1.0 | both |
| Total Time / t_end | total_time | s | 3.0 | 0.01–25.0 and must be ≥ weld time | both |
| Enable microstructure model | micro_enabled | on/off | off | — | both |
| Experimental Mechanics | mechanical_enabled | on/off | off | — | both |
| dt | dt | s | 0.0002 | 0.00001–0.01 | Simulator tab only |
| Template | template_id | — | none | built-in list plus your saved ones | Simulator tab only |
| Waveform points | waveform_times / waveform_values | s and fraction | derived from weld time | 2–64 points, then discarded | Simulator tab only |
Notes that matter in practice:
- The Mechanical fieldset toggles between Pressure [MPa] and Force [kN]. Force is converted using a fixed electrode face area of 2π × 14.0 mm², and the resulting pressure must remain within the 1–200 MPa range.
- Switching EM Control to voltage exposes an editable 1–100,000 mV field. The
legacy
voltageandvoltage_Vnames carry the raw solver potential in mV; the default 1062.2 mV is 1.0622 V physically. - Out-of-range drafts remain visible, state the allowed range, and block Run; the card does not silently replace them with a different experiment.
- If total time is below weld time the card refuses to submit and interpolates both numbers into the message — Total time (0.3 s) must be greater than or equal to weld time (0.42 s). The backend's own admission check emits the same sentence, so a configuration that passes the card is not refused later.
- Setting a weld time rewrites the current waveform to a ramp over the first third, a plateau, a 0.02 s ramp-down, then switch-off. The plateau is at full current; the ramp starts from effectively zero.
- Selecting a session material for either plate forces the microstructure switch on and locks it.
- The card and backend both accept thickness from 0.3 to 5.0 mm. Values outside the usual 0.5–3.0 mm calibration band also require explicit confirmation.
The card's raw form is a fenced rsw-params block; see
Parameter blocks.
The waveform editor is scaffolding#
The Simulator tab ships two comma-separated point lists and an interactive drag
editor, bounded to between 2 and 64 points, and it looks exactly like a
multi-pulse schedule authoring tool. It is not one. The tool facade drops both
lists before execution — the code comment reads "Waveform editing remains
frontend scaffolding and is not part of the public RSW tool schema. It cannot
affect execution and is intentionally excluded from the approved application
input." — and the backend regenerates the shape from weld_time. Whatever you
draw, the solver welds the ramp/plateau/ramp-down/switch-off profile described
above.
The compact three-field card#
There is a third, legacy chat card with only Force/Pressure, Weld Time and Total
Time. It appears only when an rsw-params block states nothing beyond those
three keys — in other words when there is nothing else for a fuller card to
carry. Its pressure ceiling is 500 MPa rather than 200, so a value it accepts
may be well outside the band the other two surfaces allow. If you see a card
headed RSW simulation parameters rather than Configure simulation, you are
on that one; restate the grades and thicknesses to get the full card back.
Supported grades — a hard limit#
RSW needs validated bulk electrical, thermal, density, latent-heat and mechanical property curves, and only 20 grades have them. The material catalog is much larger; catalog membership does not imply RSW support.
| Family | Grades |
|---|---|
| Mild / drawing | DC01, DC03, DC04, DC05, DC06 |
| HSLA | HC260LA, HC300LA, HC340LA, HC380LA, HC420LA |
| Dual-phase | DP450, DP500, DP600, DP780 |
| Press-hardening (boron) | 20MnB5, 22MnB5, 20MnB8, 25MnB5, 29MnB7 |
| Railway axle | EN13261 |
Ask for anything else — S355 or AISI 4140, say — and the run is rejected before the solver starts, with an error naming the parameter, the full list of permitted grades, and the value you supplied. The 20 grades collapse onto two bulk-property families: every DC and HC grade uses the DC04 property set, and every DP grade, every MnB grade and EN13261 use the 22MnB5 set. Two grades in the same family therefore share those curves — the grade still matters for microstructure, which uses its own per-grade card. More on what each simulator requires from a material in Capability matrix.
Calibrated templates#
Twenty-two shipped case files give you a starting point that was tuned against AWS D8.1M / DVS 2902 nugget-diameter criteria (minimum d = 5·√t, nominal qualification target 5.5·√t, where t is the thinner sheet in mm).
Show me the calibrated RSW templates
Seventeen are symmetric single-grade cases and five are dissimilar stacks. Four
of those five join two grades; the fifth, DC04_0.8mm_DC04_1.5mm, joins DC04 to
itself at two thicknesses, so "dissimilar" there means the thickness, not the
steel. You can filter by grade or joint type:
Which RSW templates exist for 22MnB5?
Each listed template returns an id (DC04_0.7mm), a name (RSW DC04 0.7mm), a
type (symmetric or dissimilar) and its flattened configuration. The listing
does not return the calibration target range — that text lives only inside the
case file on disk. If you need the target for a stack, compute it: 5·√t to
5.5·√t of the thinner sheet.
Every shipped template uses current control, 3.0 s total time, 0.0002 s timestep and 0.42 s weld time, and none of them enables microstructure or mechanics.
| Template | Stack | Current | Pressure |
|---|---|---|---|
DC04_0.7mm | DC04 0.7 mm, coated, both sides | 5.5 kA | 23.33 MPa |
HC340LA_1.2mm | HC340LA 1.2 mm, coated | 7.0 kA | 28.0 MPa |
DP600_1.2mm | DP600 1.2 mm, coated | 6.0 kA | 32.7 MPa |
DP780_1.5mm | DP780 1.5 mm, coated | 6.5 kA | 37.3 MPa |
22MnB5_1.5mm | 22MnB5 1.5 mm, bare | 6.5 kA | 42.0 MPa |
DC04_1.0mm_22MnB5_1.5mm | DC04 1.0 mm coated + 22MnB5 1.5 mm bare | 4.5 kA | 32.7 MPa |
DP600_1.2mm_22MnB5_1.5mm | DP600 1.2 mm coated + 22MnB5 1.5 mm bare | 5.0 kA | 37.3 MPa |
The shipped 20MnB5, 22MnB5 and EN13261 templates run with coating disabled; the real AlSi coating on the boron grades is not modeled, and EN13261 is bare in service. Every DC, HC and DP template runs coated. Three supported grades — 20MnB8, 25MnB5 and 29MnB7 — have no calibrated template at all. Any value you pass explicitly wins over the template's value; the template only fills in what you left unset.
The dropdown's list is not the same list#
The Simulator tab's template dropdown does not read the shipped case files. It renders a separate 20-entry list compiled into the frontend, and seven of its entries carry currents that the case files no longer use. Selecting one of those loads the older current into the form and welds at it.
| Dropdown entry | Dropdown current | Shipped case current |
|---|---|---|
| DC01 0.8mm | 7.0 kA | 5.8 kA |
| DC03 0.8mm | 7.0 kA | 5.8 kA |
| HC260LA 1.0mm | 8.5 kA | 6.5 kA |
| HC300LA 1.0mm | 8.5 kA | 6.5 kA |
| HC340LA 1.2mm | 9.0 kA | 7.0 kA |
| HC380LA 1.5mm | 11.0 kA | 8.0 kA |
| Dissimilar: DP600 + 22MnB5 | 4.5 kA | 5.0 kA |
The dropdown also omits two dissimilar cases the assistant will list
(DC04_0.8mm_DC04_1.5mm and DC04_1.0mm_22MnB5_1.0mm). Until the two lists are
reconciled, treat the assistant's listing as the calibrated one and the dropdown
as a convenience.
Alongside the shipped cases you can save the current Simulator-tab configuration as your own named template. Saved entries appear under a Saved group in the same dropdown, load exactly like a built-in one, and are removed from the Manage Templates dialog. Saved templates belong to you, not to the shipped calibration set.
Per-plate chemistry#
You can attach a chemistry to either plate independently, which is how dissimilar joints with a supplier-specific melt are run. The plate's grade still has to be one of the 20 supported names — that grade selects the property family — and your chemistry rides alongside it as a per-plate composition with its own display label, which is printed into the plot subtitle. If an active workspace or session material has a modified composition and you did not override a plate, that composition is applied to both plates.
Chemistry only reaches the physics through the microstructure path, so linking a material card to a plate has no effect unless microstructure is enabled. You can also reuse the material card from an earlier run in the session per plate. See Your own chemistry.
What you see while it runs#
The run streams. You get plain progress lines — Running RSW solver...,
Generating plots & GIF..., Uploading results... — plus up to 24 live nugget
frames sampled evenly across the simulated time. Each frame carries simulated
time, maximum temperature in K, percent complete, the phase (initializing,
welding while the current is on, then cooling), wall-clock elapsed and an
ETA. Before the first frame exists the solver sends heartbeats so the card does
not look frozen.
Two limits sit around that. The first is checked before anything starts: the
solver writes one output frame per step, so a weld is admitted only if its worst
permitted step count stays inside a 250,000-step work budget. Exceed it and you
get the number back — Total time of 60 s is an estimated 597,900 solver
steps, above the 250,000-step RSW scientific work budget for one weld. Shorten
total_time so the run can finish. The estimate assumes the worst permitted
trajectory, because cooling is adaptive and its step can shrink to 0.0001 s
whatever dt you asked for. At that floor the budget works out to almost exactly
the total_time field's 25 s ceiling, which is why a configuration the card
accepts is not refused afterwards.
The second is the solver deadline, and the exact number depends on which execution path your run takes. The durable path — the one every workspace is on today — gives the launch step the 3600-second solver timeout plus a 120-second lease grace, so 3720 s. The older in-process path stops waiting at 3600 s flat and returns Simulation timed out, with its live-frame poll loop breaking on the same deadline. Either way the run is abandoned, not killed: no signal is sent to the solver process. A worker mid-solve cannot be interrupted without corrupting its single-worker pool and leaving a half-written run directory, so it keeps computing until it exits on its own and a completion callback then cleans up. Both paths submit to that same single-worker pool, so the practical consequence is that the next weld may queue behind an abandoned one. The same applies when you re-send a message and cancel an in-flight weld: the run is marked neither failed nor succeeded until the solver actually exits. See Long-running simulations.
RSW also requires storage to be configured; without it the tool returns Supabase must be enabled to run RSW simulations.
Reading the results#
When the run finishes you get one gallery, not a wall of links. Ten filenames carry fixed labels:
- Nugget Evolution (animated) — a two-panel GIF, full cross-section plus a nugget-zone zoom, with isotherms drawn at 1723 K and 1803 K
- Temperature Contours, Temperature History
- Nugget Zoom (end of welding), Nugget Zoom (cooling)
- Joule Heat Contours, Scalar Potential Contours
- Nugget & HAZ Analysis
- Microstructure Contours and Phase History (liquid element) when microstructure ran
A microstructure-enabled run adds one more image per tracked phase, labelled
automatically from its filename: Ferrite Phase Fraction Contours, then
Pearlite, Bainite, Martensite, Austenite and Liquid for whichever of those the
phase model actually produced. Two further plots the solver writes — the phase
fraction summary and the initial/final microstructure comparison — are
deliberately suppressed from the gallery, and the .k material cards are
filtered out of it.
Click any thumbnail for a full-screen view; arrow keys move between images and Escape closes it.
The Nugget & HAZ Analysis plot is the one to read first. It classifies every steel element by peak temperature into four zones — Nugget at or above 1803 K (liquidus), Upper HAZ at or above 1050 K, Lower HAZ at or above 750 K, and Base Metal below that — and reports per-plate zone diameters plus a volume-weighted phase composition per zone. Hardness is shown only when the model has cooled below 473 K (200 °C) by the end of the simulated time and phase data are present; a run that ends hot reports no hardness. Nugget diameter is quantized by the fixed mesh, so it moves in discrete steps rather than continuously. What that means for how much to trust a number is covered in RSW validation.
The text summary alongside the gallery states peak temperature, final temperature and elapsed time, plus the grades and key parameters used.
Stored artifacts#
Every run is stored under its own run version. Persisted files are the PNG plots
and the GIF, plus three mandatory JSON records — effective_config.json,
material_resolution.json and run_config.json. A microstructure-enabled run
also stores both plate material cards (mat_Steel_top.k, mat_Steel_bottom.k)
and their resolution manifests. If any mandatory artifact is missing the run is
marked failed rather than reported as a success. Raw VTK time-series files are
produced in the solver's working directory but are not part of the stored run.
See Sessions, runs and artifacts.
Planning a process window#
There is a second RSW workflow that welds nothing. propose_rsw_process_window
compiles a staged search plan for a process window, and
approve_rsw_process_window records that you reviewed and accepted it. Both are
available to members and admins of any workspace with simulator.rsw and
feature.rsw_process_windows; a viewer cannot propose or approve. See
Workspace limits and features.
A proposal binds, and refuses to be vague about, the following:
- a goal sentence
- both plates, as workspace material revision UUIDs and their card digests
- parameter ranges over exactly
weld_current_ka(kA),weld_time_ms(ms),electrode_force_kn(kN) andhold_time_ms(ms) — canonical units, no others accepted - exit criteria over
nugget_diameter_mm,maximum_temperature_c,indentation_depth_mmorexpulsion_risk, each as a minimum, a maximum or an ordered range - a deterministic seed and a
maximum_evaluationsbetween 6 and 32 - optionally one experimental dataset revision and digest
Note that hold_time_ms is part of that vocabulary even though the weld solver
itself does not model hold time. A plan may range over it; nothing in Phases can
evaluate it yet.
The plate binding is the part that catches people out. Those are revision ids for workspace materials that have been through flow-stress prediction, not catalog grade names. A built-in grade like DP600 has no revision id, so a process-window proposal needs the material saved and revised in your workspace first. See Workspace materials. If a revision id or digest does not match a row the workspace owns, the proposal comes back as The RSW process-window proposal was not found or is not accessible.
The compiler then lays out three ordered stages, plus a fourth when you asked for the experimental comparison:
| Stage | Fidelity | Mesh | Physics it declares |
|---|---|---|---|
coarse_screening | screening | 2.0 mm | electrical, thermal |
refined_candidates | refined | 1.0 mm | electrical, thermal, mechanical, microstructure |
tolerance_checks | production | 0.75 mm | electrical, thermal, mechanical, microstructure |
experimental_comparison | experiment | — | measurement only |
Criteria are admitted only where the stage's declared physics can evaluate them. Nugget diameter and maximum temperature are thermal, so they survive into coarse screening; indentation depth and expulsion risk are mechanical, so they appear only from the refined stage onwards. A proposal whose criteria give coarse screening nothing thermal to evaluate is refused outright — coarse screening needs a thermal-evaluable exit criterion such as nugget_diameter_mm or maximum_temperature_c. The evaluation budget is split deterministically: one evaluation for the experimental stage when present, then roughly half the remainder to coarse screening, half of what is left to refined candidates, and the rest to tolerance checks.
A realistic opening, once both plates exist as workspace materials:
Propose an RSW process window for our workspace materials DP600-supplier-A
as the upper plate and 22MnB5-lot-7 as the lower, on their latest revisions.
Weld current 5 to 9 kA, weld time 200 to 400 ms, electrode force 3 to 5 kN.
Nugget diameter at least 5.5 mm and no expulsion. Cap it at 16 evaluations.
The confirmation contract#
The proposal comes back with status needs_confirmation and a card showing the
plan, the stages, the plan digest, and one exact phrase:
CONFIRM RSW PROCESS WINDOW <proposal uuid> DIGEST <64-character plan digest>
To approve, send that phrase as its own later message, byte for byte. The backend hashes your message and compares it against the hash stored with the proposal, so yes, a same-turn approval, a reworded phrase, a changed UUID, a changed digest and a phrase copied from another session all fail closed with Approval requires the exact later confirmation phrase from this proposal. Over hosted MCP the equivalent is your client's own accepted approval prompt. The database then re-checks the actor, the session, the workspace, your current role, both feature flags, both material revisions and both digests before appending a single approval receipt.
What approval does not do#
Both records carry execution_started=false, and the chat card says so — Policy
only — review required before approval, Approval only — no execution after.
The plan's scientific_status is fixed at exploratory. Approving records that
you reviewed a plan; it does not queue any evaluations, does not compute a
feasible window, and is not a weld qualification. Every candidate you decide to
try is still an ordinary run_rsw_simulation with its own confirmation card. The
tool-level detail is in Tool reference.
Next#
- Vary current or pressure across several runs in Sweep a weld schedule
- Check what the model has and has not been validated against in RSW validation
- If a run is rejected or a grade is refused, see Common problems

