Sign in ↗

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.

FieldParameterUnitDefaultRange enforcedWhere
Top Plate materialsteel_grade_topgrade nameDC04one of the 20 supported gradesboth
Bottom Plate materialsteel_grade_bottomgrade nameDC04one of the 20 supported gradesboth
Thickness (per plate)thickness_top / thickness_bottommm1.00.3–5.0both
Coating switch (per plate)coating_top / coating_bottomon/offon—both
EM Control switchem_bc_typecurrent or voltagecurrent—both
Currentcurrent_kAA in the field, kA in the payload7.0 kA1000–12000 Aboth
Solver potential (voltage mode)voltagemV1062.2 (1.0622 V)1–100,000both
Mechanical — Pressureforce_pressureMPa23.331–200both
Mechanical — Forceforce_kNkN—0.5–15both
Weld Time / EM switch-offweld_times0.420.01–1.0both
Total Time / t_endtotal_times3.00.01–25.0 and must be ≥ weld timeboth
Enable microstructure modelmicro_enabledon/offoff—both
Experimental Mechanicsmechanical_enabledon/offoff—both
dtdts0.00020.00001–0.01Simulator tab only
Templatetemplate_id—nonebuilt-in list plus your saved onesSimulator tab only
Waveform pointswaveform_times / waveform_valuess and fractionderived from weld time2–64 points, then discardedSimulator 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 voltage and voltage_V names 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.

FamilyGrades
Mild / drawingDC01, DC03, DC04, DC05, DC06
HSLAHC260LA, HC300LA, HC340LA, HC380LA, HC420LA
Dual-phaseDP450, DP500, DP600, DP780
Press-hardening (boron)20MnB5, 22MnB5, 20MnB8, 25MnB5, 29MnB7
Railway axleEN13261

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.

TemplateStackCurrentPressure
DC04_0.7mmDC04 0.7 mm, coated, both sides5.5 kA23.33 MPa
HC340LA_1.2mmHC340LA 1.2 mm, coated7.0 kA28.0 MPa
DP600_1.2mmDP600 1.2 mm, coated6.0 kA32.7 MPa
DP780_1.5mmDP780 1.5 mm, coated6.5 kA37.3 MPa
22MnB5_1.5mm22MnB5 1.5 mm, bare6.5 kA42.0 MPa
DC04_1.0mm_22MnB5_1.5mmDC04 1.0 mm coated + 22MnB5 1.5 mm bare4.5 kA32.7 MPa
DP600_1.2mm_22MnB5_1.5mmDP600 1.2 mm coated + 22MnB5 1.5 mm bare5.0 kA37.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 entryDropdown currentShipped case current
DC01 0.8mm7.0 kA5.8 kA
DC03 0.8mm7.0 kA5.8 kA
HC260LA 1.0mm8.5 kA6.5 kA
HC300LA 1.0mm8.5 kA6.5 kA
HC340LA 1.2mm9.0 kA7.0 kA
HC380LA 1.5mm11.0 kA8.0 kA
Dissimilar: DP600 + 22MnB54.5 kA5.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) and hold_time_ms (ms) — canonical units, no others accepted
  • exit criteria over nugget_diameter_mm, maximum_temperature_c, indentation_depth_mm or expulsion_risk, each as a minimum, a maximum or an ordered range
  • a deterministic seed and a maximum_evaluations between 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:

StageFidelityMeshPhysics it declares
coarse_screeningscreening2.0 mmelectrical, thermal
refined_candidatesrefined1.0 mmelectrical, thermal, mechanical, microstructure
tolerance_checksproduction0.75 mmelectrical, thermal, mechanical, microstructure
experimental_comparisonexperiment—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#